码迷,mamicode.com
首页 > 其他好文 > 详细

WordCount优化

时间:2018-04-09 00:16:33      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:1.2   rem   编写   定义   asn   junit4   等价   report   .so   

1.基本任务

1.1本项目Github地址

https://github.com/ReWr1te/WcPro

1.2PSP表格分析

PSP2.1 PSP阶段 预估耗时
(分钟)
实际耗时
(分钟)
Planning 计划 60 60
·Estimate ·估计这个任务需要多上时间 60 60
Development 开发 680 890
·Analysis ·需求分析(包括学习新技术) 30 30
·Design Spec ·生成设计文档 30 30
·Design Review ·设计复审(和同事审核设计文档) 20 30
·Coding Standard ·代码规范(为目前的开发制定合适的规范) 20 30
·Design ·具体设计 60 60
·Coding ·具体编码 240 300
·Code Review ·代码复审 40 50
·Testing ·测试(自我测试,修改代码,提交修改) 240 360
Reporting 报告 240 300
·Test Report ·测试报告 100 120
·Size Measurement ·计算工作量 40 60
·Postmortem & Process Improvement Plan ·事后总结,并提出过程改进计划 100 120
合计 980 1250

1.3代码设计思路

本人所在小组对WordCount优化项目定义了4个接口,分别为

String parseCommand(String[] args)//输入命令行命令,返回文件内容
HashMap<String, Integer> parseContent(String str)//输入文件内容,返回单词统计信息
void writeResult(HashMap<String, Integer> result)//输入单词统计信息,排序并将其写入文件
GUI//GUI界面完成人机交互

我要设计实现的接口是void writeResult(HashMap<String, Integer> result),输入的参数为单词统计信息,存放在一个HashMap里面,key是字符串类型,存放的是单词内容,value是整型,存放的是词频。首先,我要对单词词频进行降序排列,对单词词频相同的情况,按照单词所包含的每个字母从a到z的次序依次排列,若单词包含连字符-,则连字符优先。这涉及到对HashMap的排序,我参考了博客如何将HashMap,按照value值排序[1]和Java Map 按Key排序和按Value排序[2]实现对单词词频的降序排列。下面贴出重写实现Comparator接口的compare方法的代码。

/**  
 * 排序类  
  */  
private static class ValueComparator implements Comparator<Map.Entry<String,Integer>> {  
    public int compare(Map.Entry<String,Integer> m,Map.Entry<String,Integer> n){  
        if(n.getValue()-m.getValue()==0)  
            return m.getKey().compareTo(n.getKey());  
        else 
            return n.getValue()-m.getValue();  
  }  
}

使用的时候需要调用Collections工具类的sort方法,传入我们自己写的这个实现类的对象,作为参数就可以了。

接下来是输出词频排序的结果,排序之后得到的是一个List,里面存放的是Map.Entry

/**  
 * 输出  
 */  
public String output(List<Map.Entry<String,Integer>> list){  
    final String pathOfOutput="result.txt";  
    String outContent="";  
    Map.Entry<String,Integer> oMap;  
    int amount=0;//仅输出单词词频从高到低排序的前100个(从1到100)  
    for(Iterator<Map.Entry<String,Integer>> it=list.iterator();it.hasNext()&&amount<100;++amount){  
        oMap=it.next();  
        outContent+=oMap.getKey()+" "+oMap.getValue()+"\n";  
    }  
    if(outContent.length()>0) {  
        outContent = outContent.substring(0, outContent.length() - 1);//去除输出文件末尾多余的换行符  
    }  
    writeFile(pathOfOutput,outContent);  
    return outContent;  
}

关键方法流程图

1.4测试设计过程

我对ResultWriter类的排序方法sort()和输出方法output()进行了单元测试,采用黑盒测试和白盒测试方法设计了22个测试用例,进行了等价类划分,得到以下分类:
各单词词频不重复;
单词词频重复;
词频重复基础上单词首字母重复;
词频重复基础上单词首字母、二字母重复;
词频重复基础上单词首字母、二字母、三字母重复;
词频重复基础上字母和连字符的比较;
单词数不过百(50个);
单词数过百(113个)。

边界情况:
单词数为0;
单词数为100;
调用排序方法之前单词词频已有序;
调用排序方法前单词词频倒序排列。
测试用例由于内容过多,详情请见本项目Github的test文件夹上的测试用例清单。

1.5测试运行和评价

我在IntelliJ IDEA上用JUnit4单元测试框架对自己负责实现的接口进行单元测试,编写单元测试脚本ResultWriterTest.java,下面给出关键部分代码和运行截图:

    /**
     * test method sort
     * @throws Exception
     */
    @Test
    public void testSort1() throws Exception {
        System.out.println("sort1");
        List<Map.Entry<String, Integer>> list = resultWriter.sort(result);
        String sortedContent="";
        Map.Entry<String,Integer> sortedMap;
        for(Iterator<Map.Entry<String,Integer>> it=list.iterator();it.hasNext();){
            sortedMap=it.next();
            sortedContent+=sortedMap.getKey()+" "+sortedMap.getValue()+"\n";
        }
        sortedContent=sortedContent.substring(0,sortedContent.length()-1);
        assertEquals(sortedStr,sortedContent);
    }

    /**
     * test method output
     * @throws Exception
     */
    @Test
    public void testOutput1() throws Exception {
        System.out.println("output1");
        List<Map.Entry<String, Integer>> sortedList = resultWriter.sort(result);
        String string=resultWriter.output(sortedList);
        assertEquals(outContent,string);
    }

运行截图:
技术分享图片

评价:自己的单元测试的等价类划分还不够完美,可能没覆盖所有情况,边界测试也可能没覆盖所有边界,对输入内容为空的测试没有覆盖,测试覆盖了常见的情况,能满足基本需求。通过测试我觉得被测模块的质量水平较高,该模块被其他模块调用不会出现问题。

参考文献链接

[1] https://blog.csdn.net/u012730840/article/details/19699179
[2] https://www.cnblogs.com/zhujiabin/p/6164826.html
[3] https://www.cnblogs.com/Simeonwu/p/7565005.html

WordCount优化

标签:1.2   rem   编写   定义   asn   junit4   等价   report   .so   

原文地址:https://www.cnblogs.com/SSSGLQ/p/8748002.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!