第4周小组作业:WordCount优化

时间:2022-05-21 18:30:21

一、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()方法进行测试。因为程序比较简单,所以主要采用黑盒测试的方法。

第4周小组作业:WordCount优化

通过以上测试,所有结果都和预期相同,且运行速度很快,基本满足要求。

 

扩展任务:静态测试

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进行排序