源码在Github的仓库主页连接地址:https://github.com/jessiyx/jessiyxhtml
需求分析.
按照《构建之法》第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发。
1.程序可读入任意英文文本文件,该文件中英文词数大于等于1个。
2.程序须要很壮健,能读取容纳英文原版《哈利波特》10万词以上的文章。
3.指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图。
4.高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词。
5.统计该文本全部单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。
总结来讲,该项目需求分析为程序可读入任意10万词之内的英文文本文件,可查找文件并可统计对应单词在文本中出现的次数和柱状图,能够根据频率出现前K个单词的词频,最后还能够将统计结果输出到result.txtjava
测试运行.git
程序开始运行.
github
result.txt中的输出结果.
编程
选择问题1.
数组
选择问题错误时.
编程语言
选择问题2.
编辑器
比较独特的或满意的代码片断.学习
// 读取文件 String filename = "src/harrypotter.txt"; FileReader fk = new FileReader(filename); BufferedReader br = new BufferedReader(fk); // 用列表存储过滤后单词 List<String> ls = new ArrayList<String>(); String readLine = null; while ((readLine = br.readLine()) != null) { // 过滤出只含有字母的 String[] correctword = readLine.split("[^a-zA-Z]"); for (String word : correctword) { // 去除长度为0的行 if (word.length() != 0) { ls.add(word); } }
// 存储单词计数信息,key值为单词,value为单词数并对单词的词频统计 Map<String, Integer> wordsCount = new TreeMap<String, Integer>(); for (String li : ls) { if (wordsCount.get(li) != null) { wordsCount.put(li, wordsCount.get(li) + 1); } else { wordsCount.put(li, 1); } } // Map按键排序(sort by key) Map<String, Integer> resMap = sortMapByKey(wordsCount); for (Map.Entry<String, Integer> entry : resMap.entrySet()) { System.out.println(entry.getKey() + " " + entry.getValue()); } // 格式 // for (Map.Entry<String, String> entry : resultMap.entrySet()) { // System.out.println(entry.getKey() + " " + entry.getValue()); } // //
File file = new File("result.txt"); try { if (file.exists()) { file.createNewFile(); } // 讲结果输出到绝对路径下 // FileWriter ff = new FileWriter(file.getAbsoluteFile()); // 讲结果输出到src下 FileWriter ff = new FileWriter(file.getCanonicalFile()); for (Entry<String, Integer> entry : resMap.entrySet()) { ff.write(entry.getKey() + "/" + entry.getValue() + " " + "\n"); } ff.close(); System.out.println("统计完成"); // System.out.println(file.getAbsoluteFile()); // System.out.println(file.getCanonicalPath()); } catch (IOException e) { e.printStackTrace(); }
总结.测试
按照字典样式排序从a到z所用方法
Map按键排序(sort by key), 按值排序(sort by value)。
-- 引用自CSDN
总结:
在最后的项目结果中,我一共分红了三个java文件,一个main文件和一个Find文件和一个Valuesort文件,在main文件中实现了读取文件和按照字典顺序排序功能,在find文件中实现了查找文件并查找改词的词频和柱状图功能,在Valuesort文件中实现了查找前N个单词的词频排序。
这个项目可能在不少人眼里都是很基础很简单的,但是我从开始到结束差很少花了五天左右,参考了不少网上的资料和别人的代码及其所用的方法。我在编程上的知识欠缺和代码基础薄弱成了作实验二的一个关键问题。
我以为这门课程也是真正让我意识到本身不该该无所事事,就算是从0开始仍是从1开始,只要我有学习就能进步。之前的我对代码并无热爱的感受,致使我学了三年也只是门外汉,我自身的问题很是大。包括这个实验的代码,包括Markdown编辑器的学习,我都在努力。虽然如今不少代码和方法我暂时只能跟着别人的思路敲一遍,再去理解,可是我相信之后我会一点点慢慢变好,从如今开始真正的打基础。 可能不少人轻松就能完成的实验,我花了不少的时间,在慢慢学习java和慢慢学习Markdown编辑器的写做规范,这是用时间来提升本身的过程,我相信以后我会愈来愈熟练。
作这个实验的时候,参考了不少网页,可是中间有一次电脑自动关机致使我没有保存到,因此只能列出我参考的两个网页连接。
参考:(https://blog.csdn.net/awewong/article/details/52914804)
(https://blog.csdn.net/qq_15807167/article/details/51902002)
PSP2.1 | 任务内容 | 计划共完成须要的时间(min) | 实际完成须要的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 9 |
Estimate | 估计这个任务须要多少时间,并规划大体工做步骤 | 三天 | 五天 |
Development | 开发 | 120 | 130 |
Analysis | 需求分析(包括学习新技术) | 30 | 60 |
Design Spec | 生成设计文档 | 10 | 9 |
Design Review | 设计复审(和同窗审核设计文档) | 5 | 6 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 10 | 15 |
Design | 具体设计 | 10 | 10 |
Coding | 具体编码 | 150 | 240 |
Test | 测试(自我修改,修改代码,提交修改) | 30 | 50 |
Reporting | 报告 | 20 | 180 |
Rostmortem & Process Improvement Plan | 过后总结,提出过程改进计划 | 3 | 5 |
GitHub上传方式: (http://www.javashuo.com/article/p-rfviqlmf-ma.html)
GitHub地址点击☞此处