第二次作业 - 个人项目
1.GitHub地址
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 15 | 20 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 60 | 90 |
· Design Spec | · 生成设计文档 | 20 | 30 |
· Design Review | · 设计复审 | 30 | 60 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 180 | 350 |
· Code Review | · 代码复审 | 30 | 40 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 90 |
Reporting | 报告 | ||
· Test Repor | · 测试报告 | 30 | 50 |
· Size Measurement | · 计算工作量 | 20 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 60 |
合计 | 480 | 855 |
3.运行环境
- 语言:Java
- IDE: IntelliJ IDEA 2018.2.3
- 操作系统:Windows10 64bit
4.解题思路
刚拿到题目的第一反应是利用正则表达式进行词频统计。 通过正则表达式进行匹配,同时正则表达式匹配空白行,正则表达式匹配ASCII字符。
整个过程的思路是这样子:
- 先读入整个文本,将内容读进字符串,用 p{ASCII} 进行匹配完成字符统计。
- 读入文件,每次读一行,用 s+ 进行匹配判断是否是空白行。
- 单词统计先将内容用 s+ 进行分割, 在用 [1]{4,}.* 进行判断是否是单词。存入Map中,
如果不存在Map中就put同时设置value为1,如果已经在Map中那么value++。
5.设计实现过程
CalMost: 对词频进行排序,返回最多的前10个
CharsCount: 完成对字符个数的统计
LinesCount: 完成对行数的统计
WordsCount: 对单词个数进行统计,同时生成Map
6.代码规范
- 类名首字母大写,方法与变量采用驼峰式命名法。
- 注释采用 Java 文档注释规范
例如:
/**
* @param map the HashMap contain words and amount
* @return the top 10 amount of the words and amount in list
*/
public List<Map.Entry<String, Integer>> mostWords(HashMap<String, Integer> map)
- 行宽不超过IDEA默认行宽(120)
7.性能分析
利用VisualVM进行性能分析,以下是执行100000次的结果
可以看出主要耗时还是载输出到文件这里。后续再想办法看看有没有优化的空间。最近时间不够用了
8.代码说明
- 对词频进行排序并返回前10个,若不足10个就返回当前个数。
/**
* @param map the HashMap contain words and amount
* @return the top 10 amount of the words and amount in list
*/
public List<Map.Entry<String, Integer>> mostWords(HashMap<String, Integer> map) {
// convert HashMap to list
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
// sort by value then by key
list.sort(new MapComparator());
return list.size() < 10 ? list.subList(0, list.size()) : list.subList(0, 10);
}
/**
* This class define how to compare the element in list
*/
private class MapComparator implements Comparator<Map.Entry<String, Integer>> {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o1.getValue().compareTo(o2.getValue()) != 0 ? o2.getValue().compareTo(o1.getValue()) : o1.getKey().compareTo(o2.getKey());
}
}
- 单词统计:转换成小写之后进行统计。
/**
* @param content the input
*/
public WordsCount(String content) {
String[] temp = content.split("\s+");
String countRegex = "^[a-zA-Z]{4,}.*";
for (String i : temp) {
if (i.matches(countRegex)) {
sum++;
String lowCase = i.toLowerCase();
if (!map.containsKey(lowCase)) {
map.put(lowCase, 1);
} else {
int num = map.get(lowCase);
map.put(lowCase, num + 1);
}
}
}
}
9.测试单元
覆盖率应该算还行吧,每个方法都有覆盖到。
LinesCount中有个catch中的没有覆盖到。
10.总结和感想
这次看了一些测试相关的东西,之前自己写东西都没有用过单元测试,或者就自己直接print出来,测试几个是否跟自己的预期符合。没有过写单元测试的经历。
通过这次,了解了单元测试的有点,当项目较大时,通过测试更能提前发现问题。
完成作业所花的时间跟自己的预期差距也是比较大的。一开始觉得自己一直都陆陆续续有在写Android,做这个应该不会很花时间。后面才发现...Android...Java差别还是有的,主要原因还是自己对Java的掌握还是不够深。接下来以还是要花些时间加深对Java的掌握。
本次作业完成的质量,个人并不是很满意,因为手头上同时还有不少代码要写希望赶紧写完,好累好累,所以时间精力并没有充分投入,希望下一次作业能让自己比较满意。
a-zA-Z ↩︎