结对编程-词频统计(第9组)
1、Fork仓库的Github项目地址:
https://github.com/linlkg/PairProject2018
2、预估各个模块开发耗费的时间:
PSP2.1 | PersonalSoftware Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
-Estimate | -估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 230 | 303 |
-Analysis | -需求分析(包括学习新技术) | 20 | 25 |
-Design Spec | -生成设计文档 | 20 | 25 |
-Design Review | -设计复审(和同事审核设计文档) | 5 | 8 |
-Coding Standard | -代码规范(为目前的开发制定合适的规范) | 10 | 10 |
-Design | -具体设计 | 25 | 25 |
-Coding | -具体编码 | 120 | 150 |
-Test | -测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | 80 | 105 |
-Test Report | -测试报告 | 20 | 20 |
-Size Measurement | -计算工作量 | 30 | 35 |
-Postmortem&Process Improvement Plan | -事后分析,并提出过程改进计划 | 30 | 50 |
- | 合计 | 330 | 428 |
3、计算模块接口的设计与实现过程:
-第一步:相关类设计
-
读取输入输出文件类IOfile用于定义用户输入/输出的文件名和路径;
-
单词类Word用于存储单词提取以及单词词频统计;
-
词组类Phrase用于存储词组提取以及词组频度;
-
接口类UserInterface用于存储用户输入的参数值;
-
相关类图如下:
-
第二步:相关操作函数
- 提取单词函数getWord()用于根据分隔符将文件流中的单词提取出来并存储;
- 统计单词频率函数countWord();
- 排序输出单词频度函数sortWordOutput();
- 提取指定长度词组getPhrase();
- 统计词组频率函数countPhrase();
- 排序输出词组频度函数sortPhraseOutput();
4、计算模块接口部分性能改进
-性能分析图(由VS 2017/JProfiler的性能分析工具自动生成)
5、计算模块部分测试结果
输入文件为群里分享的测试文件bible-kjv.txt
6、计算模块部分异常处理说明
读文件时若读取文件失败则抛异常
//读入用户写好的TXT文件,
//尝试读取文件,若失败catch到异常并打印出来
try {
File file = new File(args[0]);
Scanner input = new Scanner(file);
String path = input.next();
List<String> wordArray = new ArrayList<String>();
int countChar=0;
int countWord=0;
int counLine=0;
InputStreamReader reader = new InputStreamReader(new FileInputStream(args[0])); // 建立一个输入流对象reader
BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言
}catch (Exception e){
e.printStackTrace();
}
7、关键代码分析
//统计行数
一行一行读入文件,所以每行读入次数加一,但要注意去除空白行
再将分割好的单词与正则表达式匹配以便统计词频
//单词的词频统计
如果已有相同的单词,则词频加1
否则创建一个<key,value>以保存新的单词
//按value的大小进行排序并输出词频最高的前十个
按字典序大小进行排序,当结果少于10个时全部输出,当结果多于10个时输出前10个结果
8、描述结对的过程
结对体会:
- 结对中汪璟玢充当领航员(Navigator)角色,林静充当驾驶员(Driver)角色。先是一起讨论做了大体类的设计和算法流程设计,接着林静就开始编程。两个人编程还是比一个人来的效率高些,有问题一起讨论,错误也第一时间被指出,特别是一开始的讨论,就先定义和封装了几个要用到的函数,避免了后期推翻修改,提高了开发效率。不过缺点也是有的,就是一个人在编程的时候,另一个人不好打扰,默默滴看,后面发现没有完全按照领航员的设计来实现。函数没有完全按照预期抽象出来,导致效能分析处有问题!设计当中的接口和新增功能未实现,但类图当中的设计将其抽象出来方便了后续的代码优化。
- 这次的体会真的很深,实打实的结对,两人分工合作完成一个看似不难的任务,实际执行过程中还是遇到不少困难,结对的最大好处就在此处体现:在遇到困难的时候总是可以通过提醒和讨论解决之!
- 两个人的合作总是胜过一个人埋头苦写代码的,通过两个人结对的交流和探讨,会比平常一个人设计节约了不少的时间。由于生疏在百度许多东西的写法上耽