github地址 :https://github.com/NSDie/personal-projectjava
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务须要多少时间 | 400 | 690 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 20 | 15 |
· Design Spec | · 生成设计文档 | 20 | 0 |
· Design Review | · 设计复审 | 20 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 15 |
· Design | · 具体设计 | 20 | 30 |
· Coding | · 具体编码 | 60 | 90 |
· Code Review | · 代码复审 | 20 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 20 | 120 |
Reporting | 报告 | ||
· Test Repor | · 测试报告 | 120 | 240 |
· Size Measurement | · 计算工做量 | 20 | 30 |
· Postmortem & Process Improvement Plan | · 过后总结, 并提出过程改进计划 | 60 | 90 |
合计 | 400 | 690 |
题目要求:文本读写、词频统计。git
文本读写用io库 ,读入字符串后用正则表达式或者本身写字符串分割函数或者封装好的分割函数来获取单词,词频统计用HashMap
存,结果排序一下输出。github
流程图以下:
正则表达式
主函数里调用各个功能。算法
单元测试:每一个函数依次测试,测试经过后;整合到主函数里;而后用命令行窗口进行总体功能测试。数组
目前没怎么改进程序,由图中能够看见,Tool类之调用了一次,就是在主函数统计那一次。其他的就是排序跟文本读写,HashMap的插入与查找的性能消耗。函数
这是主函数,实现主要流程。性能
public class Main { public static void main(String[] args) { //文本读入 File file = new File(args[0]); FileRead fileRead = new FileRead(); String data = fileRead.Input(file); //处理文本 Tools tools = new Tools(); int length = data.length(); int wordAmount = tools.WordCount(data); int lines = data.split("\n").length; List<HashMap.Entry<String, Integer>> wordList = tools.WordSort(); //文本输出 fileRead.Output(length,wordAmount,lines,wordList); } }
Tool类中的词频统计:单元测试
调用了几个函数,StringTokenizer()
——split()
函数的增强版,也是用来分割字符串的;replaceAll()
——替换部分非字母数字字符。学习
public int WordCount(String data){ int amount = 0; String data_l = data.toLowerCase(); // 所有字母转小写。 String regex = "[^0-9a-zA-Z]"; //正则表达式,过滤非字母数字字符。 data_l = data_l.replaceAll(regex, " "); //清洗文本。 StringTokenizer words = new StringTokenizer(data_l); //分割文本成单词。 try { while (words.hasMoreTokens()) { String word = words.nextToken(); if (word.length() >= 4) { //判断单词长度是否大于等于4 if (Character.isLetter(word.charAt(0)) && Character.isLetter(word.charAt(1)) && Character.isLetter(word.charAt(2)) && Character.isLetter(word.charAt(3))) { //判断单词前4个是否为字母 amount++; if (!wordCount.containsKey(word)) { wordCount.put(word, new Integer(1)); } else { int count = wordCount.get(word) + 1; wordCount.put(word, count); } } } } }catch (Exception e){ System.out.println("词频统计报错:"); System.out.println(e.getMessage()); } return amount; }
其余 FileRead就是一些文本处理,读与写。
具体见github。
有基本的容错性:
根据输入的文件名找不到文件。
文件过大,会数组越界没法读入,现已修复。顺带优化了读写的速度。
找了一个日志文件测试了一下。
调优:
发现String经过"+"这种方法来拼接字符串是很是低效率的,因而用StringBuilder
来代替。
附上几回的测试图:
此次做业整体来讲,花在写报告跟测试的时间比较多。并且对于词频统计这一问题来讲,之前作过相似的oj题,可是算法题跟项目又是两码事,算法题只要作到最优能过测试就行,可是项目不同。《构建之法》中提到的,“能证实所开发的软件是能够继续维护和发展的”,项目不只仅作到知足用户需求,还要作到低耦合,不管是方便之后别人参与进来仍是接手你的项目,都会更省时间。因此虽然花了不少时间,可是我以为是有价值的。单元测试也是如此。