• 第二次作业


    第二次作业 - 个人项目

    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字符。
    整个过程的思路是这样子:

    1. 先读入整个文本,将内容读进字符串,用 p{ASCII} 进行匹配完成字符统计。
    2. 读入文件,每次读一行,用 s+ 进行匹配判断是否是空白行。
    3. 单词统计先将内容用 s+ 进行分割, 在用 [1]{4,}.* 进行判断是否是单词。存入Map中,
      如果不存在Map中就put同时设置value为1,如果已经在Map中那么value++。

    5.设计实现过程

    CalMost: 对词频进行排序,返回最多的前10个
    CharsCount: 完成对字符个数的统计
    LinesCount: 完成对行数的统计
    WordsCount: 对单词个数进行统计,同时生成Map

    6.代码规范

    1. 类名首字母大写,方法与变量采用驼峰式命名法。
    2. 注释采用 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)
    
    1. 行宽不超过IDEA默认行宽(120)

    7.性能分析

    利用VisualVM进行性能分析,以下是执行100000次的结果
    CPU
    内存

    可以看出主要耗时还是载输出到文件这里。后续再想办法看看有没有优化的空间。最近时间不够用了

    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的掌握。
    本次作业完成的质量,个人并不是很满意,因为手头上同时还有不少代码要写希望赶紧写完,好累好累,所以时间精力并没有充分投入,希望下一次作业能让自己比较满意。


    1. a-zA-Z ↩︎

  • 相关阅读:
    Scrapy-02-item管道、shell、选择器
    django类视图的装饰器验证
    django禁用csrf
    django admin
    关系型数据库与非关系型数据库
    LINQ.CS
    测试
    测试
    一个测试
    WPF中的Style
  • 原文地址:https://www.cnblogs.com/darkexisted/p/9631732.html
Copyright © 2020-2023  润新知