结对作业——WordCount进阶版
1、码云项目地址
码云地址:https://gitee.com/NiBiWoWuLiao/PairProject-Java
结对小伙伴姓名:林文秀
学号:201621123003
博客地址:https://www.cnblogs.com/linwenxiu-1223/p/9750972.html
码云截图:
2、PSP表格。
PSP2.1 | 开发流程 | 预估耗费时间(分钟) | 实际耗费时间(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 25 |
· Estimate | 明确需求和其他相关因素,估计每个阶段的时间成本 | 10 | 20 |
Development | 开发 | 200 | 240 |
· Analysis | 需求分析 (包括学习新技术) | 20 | 20 |
· Design Spec | 生成设计文档 | 10 | 15 |
· Design Review | 设计复审 | 10 | 45 |
· Coding Standard | 代码规范 | 30 | 25 |
· Design | 具体设计 | 30 | 50 |
· Coding | 具体编码 | 150 | 180 |
· Code Review | 代码复审 | 10 | 15 |
· Test | 测试(自我测试,修改代码,提交修改) | 30 | 55 |
Reporting | 报告 | 60 | 85 |
· | 测试报告 | 30 | 30 |
· | 计算工作量 | 30 | 25 |
· | 并提出过程改进计划 | 30 | 15 |
3. 功能改进的设计与实现过程。
代码分为三大类:
- FiLeFunction类:读文件与写入文件的操作
- Word类:统计字符,统计单词,统计行数,以及单词频数排序和单词短语的排序
- Main类:主函数
函数分为:
-
ReadFromFile(String path)//读取文件
public BufferedReader ReadFromFile(String path) throws IOException { //读取文件 File file = new File(path); if (!file.exists() || file.isDirectory()) { System.out.println("请输入正确文件名!"); throw new FileNotFoundException(); } InputStreamReader isr = new InputStreamReader(new FileInputStream(path));// 建立一个输入流对象 BufferedReader br = new BufferedReader(isr); return br; }
-
WriteToFile(String path,String content)//写入文件
public void WriteToFile(String path,String content) { //写入文件 try { OutputStream out = new FileOutputStream(path); out.write(content.getBytes()); out.close(); } catch (Exception e) { e.printStackTrace(); } }
-
charCount() //统计字符
-
wordCount()//统计单词总数
-
lineCount()//统计行
-
Phrase(int number) //统计词组并且排序
public String Phrase(int number) throws Exception{
if(number>lists.size()){
return "the number is too long";
}
String wordGroup[] = new String[lists.size()-number+1];
for (int i = 0; i <lists.size()-number+1 ; i++) {
//按number数为一组加入数组
}
Map<String,Integer> treeMap =new TreeMap<String,Integer>();
for (int i = 0; i < wordGroup.length; i++) {
String s = wordGroup[i];
if (!treeMap.containsKey(s)) {
//不存在
} else {
//已经存在
}
}
List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(treeMap.entrySet());
Collections.sort(list, ((o1, o2) -> o2.getValue().compareTo(o1.getValue())));
String s[] = new String[wordGroup.length];
int i =0;
for (Map.Entry<String,Integer>entry:list) {
String key = entry.getKey();
Integer value = entry.getValue();
s[i] = key + ": " + value;
i++;
}
String string = s[0]+"\n";
for (int j = 1; j <i ; j++) {
string = string + s[j] + "\n";
}
return string ;
}
- sortWord(int number) //统计单词并排序
演示截图:在本次演示过程中文本内容均为Monday Tuesday Wednesday Thursday
-
输出三个为一组的词组:
-
输出出现频率第一的单词,并将其写入文件中
4.功能改进模块部分单元测试展示。
改进思路:根据上周是没有完成按模块分写而将所有的函数都放在Main类中,这周将对文件的操作和对字符的统计操作分成单个单独的类。而且本次要求增加的统计新功能有两个,一是词组统计,由于词组统计就没办法再像之前统计单词一样根据非数字字母划分,我们的想法:根据空格划分,然后根据词组的长度进行先拼接存入一个新数组中,然后再去读这个存放词组的数组。对于自定义输出就参照了上周要求输出前十,修改为自定义输出要求的个数。
这里放上类图:
本次测试的函数着重于新增的词组部分上周实现的那些就进行了简单的正确性测试。如图:
对于按要求输出词组的测试分别进行了词组长度大于或小于或等于单词长度的三种测试:
测试读取非根目录下的本地文件
单元测试覆盖率图:
5.回归测试部分展示
-
由于没有考虑输入m的数超过了单词总数报错:
-
解决方案并回归测试:
6.描述结对的过程,提供非摆拍的两人在讨论的结对照片。
- 在本次结对过程中,其实还是相处得挺愉快的,由于有了上周的个人的基础,这周我们先是交流了自己的想法,然后讨论后决定从一个人的思路延展下去从中去改进。
- 我们是先使用Netbeans捏出了GUI界面,然后去实现事件的监听。由于本周新增了功能是要求输入一串命令来进行操作,刚开始我们的想法是先各自尝试,一种是选择输入一整串后进行操作,一种是例如输入一个-m然后再判断输入,即分离式实现,后来我们选择了输入一整串后进行操作。对于实现功能我们统一想法后,然后一个人开始写一个人在看,然后每写完一个功能,我们会进行数据的测试。然后根据错误换由另外一个人写。这样思维的完美衔接还是很愉快的!我觉得两个人思想在一条线上还是挺有效率的。