202103226-1 编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/computer-science-class3-2018/homework/11879
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-science-class3-2018/homework/11879
这个作业的目标 1.学习使用git和github 2.编写WordCount程序 3.总结
学号 20188483
其他参考文献 《构建之法》,CSDN

gitee地址:
https://gitee.com/flz13873652172/project-java

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 43
• Estimate • 估计这个任务需要多少时间 30 43
Development 开发 780 1030
• Analysis • 需求分析 (包括学习新技术) 120 260
• Design Spec • 生成设计文档 30 60
• Design Review • 设计复审 10 15
• Coding Standard • 代码规范 (为目前的开发制定合适的规范) 30 25
• Design • 具体设计 90 110
• Coding • 具体编码 360 400
• Code Review • 代码复审 20 10
• Test • 测试(自我测试,修改代码,提交修改 120 150
Reporting 报告 135 145
• Test Repor • 测试报告 90 100
• Size Measurement • 计算工作量 15 10
• Postmortem & Process Improvement Plan • 事后总结, 并提出过程改进计划 30 35
合计 1030 1217
解题思路描述
一、需求分解
首先我根据作业要求,把需求分解成以下小部分

读取文件内数据
统计文件字符数
统计文件单词总数
统计文件有效行数
统计出现频率最高的10个单词
以UTF-8格式输出到指定文件
 
代码规范制定链接
https://gitee.com/flz13873652172/project-java/blob/master/codestyle.md
设计与实现过程
一、类构建组织
为了实现功能独立,我将需求2、3、4、5封装在WordCountMethods类,进行字符数量、行数、单词数、词频的统计;将需求1、6封装进WordCountIO类,:进行文件内容的读取,以及处理结果的写入;最后设计一个WordCount类调用以上两个类的方法去实现WordCount功能。
二、主要方法设计
2.1 WordCountIO/读取文件转化为string形式

FileInputStream fileinputstream=new FileInputStream(filePath);
InputStreamReader inputstreamreader=new InputStreamReader(fileinputstream);
br = new BufferedReader(inputstreamreader);
int c;
while ((c = br.read()) != -1) {
    strBud.append((char) c);
}
br.close();
return strBud.toString();

2.1.1 解释思路
最开始我是想到用BufferedReader中包装InputStreamReader类,但是一开始程序用的是BufferedReader类的readline(),后期单元测试的时候发现问题,readline当遇到换行符('
'),回车符('
')时会终止读取表示该行文字读取完毕且返回该行文字(不包含换行符和回车符),就会导致无法统计换行符、回车符,于是后来改用read(),读取1个或多个字节,返回一个字符,当读取到文件末尾时,返回-1。
2.2 WordCountMethods/统计文件有效行数

InputStream inpStr = new FileInputStream(filePath);
BufferedReader br = new BufferedReader(new InputStreamReader(inpStr));
//空白行的正则匹配器
Pattern blankLinePattern = Pattern.compile(BLANK_LINE_REGEX);
String line = null;
while ((line = br.readLine()) != null) {
    if (blankLinePattern.matcher(line).find()) {
    //是空白行就计数
        blankLine++;
    }
    allLine++;
}
//有效行是总行数减去空白行数
validLine = allLine-blankLine;
return validLine;

2.2.1 解释思路

我的想法是统计出所有行数减去空白行就是有效行数.但是如何判断哪一行是空白行是个关键问题。
我经过上网搜索查阅资料,发现可以使用正则表达式"s+"
正则表达式中s+匹配任何空白字符,包括空格、制表符、换页符等等, 等价于[ f

	v]

f -> 匹配一个换页

 -> 匹配一个换行符

 -> 匹配一个回车符
	 -> 匹配一个制表符
v -> 匹配一个垂直制表符
 2.3 WordCountMethods/统计合法单词数
int words = 0;
//先全部转小写
String lowerStr = str.toLowerCase();
//匹配非单词非数字的字符
Pattern pat = Pattern.compile(UN_ALPHABET_NUM_REGEX);
Matcher mat = pat.matcher(lowerStr);
//转换为空格
lowerStr = mat.replaceAll(" ");
//按规定的分隔符拆分
String[] word = lowerStr.split("\s+");
for (int i = 0; i < word.length; i++) {
    String tw = word[i];
    //判断是不是要求的单词
    if (tw.matches(FIRST_FOUR_APLH_REGEX)) {
        words++;
        if (!map.containsKey(tw)) {
            map.put(tw, 1);
        } 
        else {
            int num = map.get(tw);
            map.put(tw, num + 1);
        }
    }
}
2.4 WordCountMethods/统计出现频率最高的单词

Collections.sort(list,new Comparator<Map.Entry<String, Integer>>(){
//Treemap只要比较出现次数,不用再比较字典序
public int compare(Map.Entry<String, Integer> word1, Map.Entry<String, Integer> word2) {
    return word2.getValue() - word1.getValue();
}


心路历程与收获

感觉太难了,第一关git的使用就不会,后来自己在b站看视频讲解会了(地址:https://www.bilibili.com/video/BV1FE411P7B3?p=9&spm_id_from=pageDriver)
也非常感谢我的室友的帮助,打代码的过程中出现了很多问题,还是自己专业知识不够丰富,还得多多学习;
希望老师下次别弄这么难的了,孩子心里苦呀
原文地址:https://www.cnblogs.com/FLZ1208/p/14608918.html