一、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.youkuaiyun.com/maritimesun/article/details/7668718 代码规范工具checkstyle使用手册
https://blog.youkuaiyun.com/u011734144/article/details/52384284 对TreeMap按照value进行排序