第4周小组作业:WordCount优化

时间:2022-12-20 08:10:59

Github地址

https://github.com/ohayogirls/wcPro

PSP表格

PSP2.1

PSP阶段

预计耗时

(分钟)

实际耗时

(分钟)

Planning

计划

 10

 15

· Estimate

· 估计这个任务需要多少时间

 10

 15

Development

开发

 390

 490

· Analysis

· 需求分析 (包括学习新技术)

 30

 20

· Design Spec

· 生成设计文档

 20

 30

· Design Review

· 设计复审 (和同事审核设计文档)

 30

 40

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 40

 10

· Design

· 具体设计

 20

 60

· Coding

· 具体编码

 120

 100

· Code Review

· 代码复审

 30

 30

· Test

· 测试(自我测试,修改代码,提交修改)

 100

 180

Reporting

报告

 90

 100

· Test Report

· 测试报告

 45

 30

· Size Measurement

· 计算工作量

 15

 10

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 30

 60

 

合计

 

 

模块的接口的实现

我在小组中负责的是核心业务模块,即实现单词识别,词频统计,排序这些功能
因为考虑到这些功能之间有相互的参数传递,且由我一个人实现,所以我将模块通过一个Core类来实现,Core类下的方法分别实现了各个功能,下面给出具体代码和解释。

  • Core类的属性content是输入文件的内容,构造方法从输入类中得到content

    private String content;
    public Core(String str){
        this.content = str;
    }
  • 方法CountWord(),功能是识别单词,并统计词频。单词和词频可以看做是一个键值对,所以我在这里用到了HashMap来保存单词和词频。识别单词是通过正则表达式([a-zA-Z]+(-[a-zA-Z]+)*)去匹配文件内容实现的,匹配到一个单词,先判断HashMap里是是否有这个单词,若没有则将这个单词添加到HashMap中同时设词频为1,若有则将该单词词频+1。

    public HashMap<String, Integer> CountWord(){
        //识别单词,统计词频
        HashMap<String,Integer> map = new HashMap<String,Integer>();
        String reg = "([a-zA-Z]+(-[a-zA-Z]+)*)";
        Pattern p = Pattern.compile(reg);
        Matcher m = p.matcher(content);
        while(m.find()){
                String w = m.group().toLowerCase();
            if(null == map.get(w)){
                map.put(w, 1);
            }else{
                int x = map.get(w);
                map.put(w, x + 1);
            }
        }
        return map;
        }
  • 方法WordSort(),将得到的单词和词频按给定的规则进行排序,先比较词频,从大到小排列,如果词频一样再比较单词的首字母的ASCII码的值从小到大排列,java里对Collection对象有sort接口,我们只要重写Comparator里的comrare方法即可实现自己定义的排序。

        public List<Map.Entry<String, Integer>>WordSort(HashMap<String,Integer>){
                List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());  
                Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {  
                public int compare(Map.Entry<String, Integer> o1,  
                            Map.Entry<String, Integer> o2) {  
                if((o2.getValue()).toString().compareTo(o1.getValue().toString())==0){
                    return (o1.getKey()).toString().compareTo(o2.getKey().toString());
                }
                else{
                    return (o2.getValue()).toString().compareTo(o1.getValue().toString());  
                }
            }  
        });
        return list;
    }

测试用例的设计

  • 考虑到我写的模块里只有一个Core类,里面用到了正则表达式和在排序的时候有判断语句,逻辑结构很清晰,设计测试用例时考虑例如:测试输入为空的边界情况,测试大小写字母及其混合,测试大小写单词及其混合,测试单词词频统计,测试对-的处理,测试~作为分隔符,测试!作为分隔符,测试_作为分隔符,测试数字作为分隔符,以及测试非英文字母(如日文),测试奇怪的符号,尽可能覆盖单词判别的所有情况。
  • 测试效率的考虑:使用junit框架能够实现快速有效地进行针对性的测试,通过与自己的预期结构进行对比,查漏补缺。
  • 测试用例表,具体代码见github中test文件夹
    第4周小组作业:WordCount优化

    单元测试截图

    CoreTest:根据我设计的20个测试用例编写的测试脚本,将实际结果与预期结果进行对比。结果全部通过,单元测试合格。
    第4周小组作业:WordCount优化

    小组贡献分:0.4

    参考文献

    https://www.cnblogs.com/longronglang/p/7458027.html
    https://zhidao.baidu.com/question/370032964655027804.html
    https://blog.csdn.net/u012730840/article/details/19703101