这个做业属于哪一个课程 | 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-javajava
PSP表格git
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 |
解题思路描述 1、需求分解 首先我根据做业要求,把需求分解成如下小部分 读取文件内数据 统计文件字符数 统计文件单词总数 统计文件有效行数 统计出现频率最高的10个单词 以UTF-8格式输出到指定文件
代码规范制定连接 https://gitee.com/flz13873652172/project-java/blob/master/codestyle.md
设计与实现过程 1、类构建组织 为了实现功能独立,我将需求二、三、四、5封装在WordCountMethods类,进行字符数量、行数、单词数、词频的统计;将需求一、6封装进WordCountIO类,:进行文件内容的读取,以及处理结果的写入;最后设计一个WordCount类调用以上两个类的方法去实现WordCount功能。
2、主要方法设计 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当遇到换行符('\n'),回车符('\r')时会终止读取表示该行文字读取完毕且返回该行文字(不包含换行符和回车符),就会致使没法统计换行符、回车符,因而后来改用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\n\r\t\v] \f -> 匹配一个换页 \n -> 匹配一个换行符 \r -> 匹配一个回车符 \t -> 匹配一个制表符 \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(); }
心路历程与收获github
感受太难了,第一关git的使用就不会,后来本身在b站看视频讲解会了(地址:https://www.bilibili.com/video/BV1FE411P7B3?p=9&spm_id_from=pageDriver) 也很是感谢个人室友的帮助,打代码的过程当中出现了不少问题,仍是本身专业知识不够丰富,还得多多学习; 但愿老师下次别弄这么难的了,孩子内心苦呀