一、GitHub地址
https://github.com/ChenSilence/wcPro
二、PSP表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
10 | 10 |
· Estimate |
· 估计这个任务需要多少时间 |
10 | 10 |
Development |
开发 |
510 | 510 |
· Analysis |
· 需求分析 (包括学习新技术) |
60 | 60 |
· Design Spec |
· 生成设计文档 |
30 | 30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 | 30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 | 30 |
· Design |
· 具体设计 |
60 | 60 |
· Coding |
· 具体编码 |
120 | 120 |
· Code Review |
· 代码复审 |
60 | 60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 | 120 |
Reporting |
报告 |
70 | 70 |
· Test Report |
· 测试报告 |
30 | 30 |
· Size Measurement |
· 计算工作量 |
10 | 10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 | 30 |
合计 |
590 | 590 |
三、代码设计思路
1接口描述
根据小组内的分工,我负责排序模块,需要实现的接口是WordSort类中的sort()方法。该方法需要接收一个map,将map中的元素根据value的值从大到小进行排序(若value相等,则按照key的ASCII顺序),返回一个排好序的TreeMap。
2设计思路
我原本想通过算法课程中学到的排序方法对value进行排序后将数据插入一个新的map中。但在查找资料的过程中,我发现TreeMap可以通过比较器直接进行排序,所以最终我选择了更为简单的比较器排序。
3实现过程
WordSort类:包括实现排序的sort()方法。
public static TreeMap<String, Integer> sort(Map<String, Integer> map) 实现对map排序并返回一个TreeMap的方法。
ValueComparator类:比较器类,包括compare()方法。
public int compare(String a, String b) 比较的时候,传入的两个参数应该是map的两个key,然后获取对应的value进行比较。
4代码说明
在实现过程中已经介绍了类和方法,结合以下代码及注释即可说明。
import java.util.Comparator; import java.util.Map; import java.util.TreeMap; public class WordSort { /** * map排序. * 按value从大到小,若相同则按key的ASCII顺序 * @param map 待排序的map * @return 排好序的TreeMap */ public static TreeMap<String, Integer> sort(Map<String, Integer> map) { ValueComparator bvc = new ValueComparator(map); // 比较器 TreeMap<String, Integer> sortedMap = new TreeMap<String, Integer>(bvc); // sortedMap通过该比较器的方法进行排序 sortedMap.putAll(map); // 将待排序的map填入sortedMap中进行排序 return sortedMap; } } class ValueComparator implements Comparator<String> { Map<String, Integer> base; // 将需要比较的map集合传进来 public ValueComparator(Map<String, Integer> base) { this.base = base; } // 传入的两个参数应该是map的两个key,然后获取对应的value进行比较 public int compare(String a, String b) { if (base.get(a) > base.get(b)) { return -1; } else { return 1; } } }
四、测试设计过程
对sort()方法进行测试。因为程序比较简单,所以主要采用黑盒测试的方法。
通过以上测试,所有结果都和预期相同,且运行速度很快,基本满足要求。
扩展任务:静态测试
1.开发规范说明
《阿里巴巴Java开发手册终极版v1.3.0》
2.交叉代码评审
其他组员的代码节选:
Set<Entry<String, Integer>> set = map.entrySet(); for (Entry<String, Integer> entry : set) { if (i > 0) { output.println();// 避免出现最后一行换行 } output.print(entry.getKey() + " " + entry.getValue()); i++;// 最多输出前100个 if (i >= 100) { break; } }
用tab而不是空格,不符合规范
左大括号不换行,符合规范
for/if和左括号间有一个空格,符合规范
//与注释间有一个空格,符合规范
3.静态代码扫描
使用checkstyle工具,发现了不规范的地方:
缺少Javadoc。
缩进不应该用tab,应该为4个空格。
*类 ValueComparator 应位于它自己的源文件中。
高级功能
因为本次代码的编写比较简单,基本上已经是最优化了,而且从运行结果来看十分快。
所以最后只将这段代码简化:
ValueComparator bvc = new ValueComparator(map); TreeMap<String, Integer> sortedMap = new TreeMap<String, Integer>(bvc);
改为如下代码,节省内存:
TreeMap<String, Integer> sortedMap = new TreeMap<String, Integer>(new ValueComparator(map));
我的小组贡献率为0.3,学号16637
参考链接:
http://www.cnblogs.com/ningjing-zhiyuan/p/8654132.html 第四周小组作业说明
https://blog.csdn.net/maritimesun/article/details/7668718 代码规范工具checkstyle使用手册
https://blog.csdn.net/u011734144/article/details/52384284 对TreeMap按照value进行排序