202103226-1 编程作业

这个作业属于哪个课程 软工-2018级计算机2班
这个作业要求在哪里 作业要求
这个作业的目标 学习使用GITHUB或者码云
学号 20188452
参考文献 eclipse中使用GIT或者码云(eclipse最新版自带GIT插件)
参考文献 正则表达式的使用

文章主体


码云项目地址


PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 8 20
Estimate 估计这个任务需要多少时间 60 360
Development 开发 120 240
Analysis 需求分析 (包括学习新技术) 30 120
Design Spec 生成设计文档 30 15
Design Review 设计复审 5 3
Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 0
Design 具体设计 15 30
Coding 具体编码 100 180
Code Review 代码复审 15 30
Test 测试(自我测试,修改代码,提交修改) 20 60
Reporting 报告 30 30
Test Repor 测试报告 40 10
Size Measurement 计算工作量 0 0
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 15 5
合计 521 1178

解题思路描述

*1.通过控制台输入命令读取文件地址。
*2.通过BufferedReader读取文件。
*3.通过readLine()逐行读入计算字符长度和计算行数。
*4.逐个分隔读取单词计算单词总数(正则表达式)
*5.通过HASmap进行单个单词的统计。


代码规范连接:

https://gitee.com/fengmixinluo/project-java.git


计算模块接口的设计与实现过程

通过主函数中的参数对各个方法的路径进行传参。
*WordCount中

Lib.charnumber(f);
Lib.wordsnumber(f);
Lib.line(f);
Lib.Wordsfreqret(f);

*Lab中对各个方法的实现。

public class Lib {
    public static int charnumber(File f) throws IOException {
public static int wordsnumber(File f) throws IOException {
public static int line(File f) throws IOException 
public static  String Wordsfreqret(File f)throws IOException


Lib.charnumber(f):

try {
            String str = null;
            while ((str = in.readLine()) != null) {  //readLine()方法, 用于读取一行,只要读取内容不为空就一直执行
                Number_of_characters += str.length();  //用于统计总字符数
            }
            //System.out.println("该文本共有" + Number_of_characters + "个字符");  //输出总的字符数
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Number_of_characters;
    }

Lib.wordsnumber(f):

try {
            String temp = in.readLine();
            cun = new StringBuffer();
            while (temp != null) {
                cun.append(temp);
                cun.append(" ");  //每行结束多读一个空格
                temp = in.readLine();

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        String info = cun.toString();
        String regex = "[,。?,.? ]";
        String s[] = info.split(regex);
        /*统计单词个数*/
        for (int i = 0; i < s.length; i++) {
            if (s[i].length() >= 4) {
                String temp = s[i].substring(0, 4);
                temp = temp.replaceAll("[^a-zA-Z]", "");
                if (temp.length() >= 4) {
                    wordnumber++;
                }
            }
        }

计算模块接口部分的性能改进

最终代码测试截图:
测试代码:

long startTime = System.currentTimeMillis();
   long endTime=System.currentTimeMillis();
     long runetime=endTime - startTime;
   System.out.println("程序耗时"+runetime+"ms");

以前的软件自带测试就没写测试程序了,而我也只会写测试运行时间。
测试数据大小:
characters:59817
words:5581
lines414

以前的测试记录和commit记录:


计算模块部分单元测试展示。

统计文件的字符数(对应输出第一行):

只需要统计Ascii码,汉字不需考虑
空格,水平制表符,换行符,均算字符
统计文件的单词总数(对应输出第二行),单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。

英文字母: A-Z,a-z
字母数字符号:A-Z, a-z,0-9
分割符:空格,非字母数字符号
例:file123是一个单词, 123file不是一个单词。file,File和FILE是同一个单词
统计文件的有效行数(对应输出第三行):任何包含非空白字符的行,都需要统计。

统计文件中各单词的出现次数(对应输出接下来10行),最终只输出频率最高的10个。

频率相同的单词,优先输出字典序靠前的单词。

例如,windows95,windows98和windows2000同时出现时,则先输出windows2000

输出的单词统一为小写格式

测试数据:

结果:

测试数据:

结果:


计算模块部分异常处理说明。

MaP返回值读取异常:

List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
    Collections.sort(list, valueComparator);

    StringBuffer top10Words=new StringBuffer();
    for (int i=0;i<10;i++) {
              Map.Entry<String, Integer> entry = list.get(i);
       System.out.println(entry.getKey() + ":" + entry.getValue());
        top10Words.append(entry.getKey() + ":" + entry.getValue()+"\n");
    }


边界异常。。。数据小于10

对边界异常的修改:

List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
        Collections.sort(list, valueComparator);

        StringBuffer top10Words=new StringBuffer();

        for (int i=0;i<((10<=list.size())?10:list.size());i++) { //
            Map.Entry<String, Integer> entry = list.get(i);
// 测试      System.out.println(entry.getKey() + ":" + entry.getValue());
            top10Words.append(entry.getKey() + ":" + entry.getValue()+"\n");
        }

        return  new String(top10Words);
    }

心路历程与收获:

这个作业还是比较困难的,用了很多时间去完成它,但代码还是有很多不如意的地方只能说是勉强完成了吧,
但是也学到了挺多比如
*1.HAsmap的应用
*2.对基础知识的巩固
*3.程序总体设计要加强。

posted @ 2021-03-30 19:19  风靡心落  阅读(72)  评论(0编辑  收藏  举报