github地址 :https://github.com/NSDie/personal-project

一、计划表

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

二、 解题思路

题目要求:文本读写、词频统计。

文本读写用io库 ,读入字符串后用正则表达式或者自己写字符串分割函数或者封装好的分割函数来获取单词,词频统计用HashMap存,结果排序一下输出。

三、 设计实现

流程图如下:

主函数里调用各个功能。

单元测试:每个函数依次测试,测试通过后;整合到主函数里;然后用命令行窗口进行整体功能测试。

四、改进程序





目前没怎么改进程序,由图中可以看见,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题,但是算法题跟项目又是两码事,算法题只要做到最优能过测试就行,但是项目不一样。《构建之法》中提到的,“能证明所开发的软件是可以继续维护和发展的”,项目不仅仅做到满足用户需求,还要做到低耦合,无论是方便以后别人参与进来还是接手你的项目,都会更省时间。所以虽然花了很多时间,但是我觉得是有价值的。单元测试也是如此。

词频统计 ——Java的更多相关文章

  1. 如何用java完成一个中文词频统计程序

    要想完成一个中文词频统计功能,首先必须使用一个中文分词器,这里使用的是中科院的.下载地址是http://ictclas.nlpir.org/downloads,由于本人电脑系统是win32位的,因此下 ...

  2. 词频统计的java实现方法——第一次改进

    需求概要 原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 ...

  3. 效能分析——词频统计的java实现方法的第一次改进

    java效能分析可以使用JProfiler 词频统计处理的文件为WarAndPeace,大小3282KB约3.3MB,输出结果到文件 在程序本身内开始和结束分别加入时间戳,差值平均为480-490ms ...

  4. 【第二周】Java实现英语文章词频统计(改进1)

    本周根据杨老师的spec对英语文章词频统计进行了改进 1.需求分析: 对英文文章中的英文单词进行词频统计并按照有大到小的顺序输出, 2.算法思想: (1)构建一个类用于存放英文单词及其出现的次数 cl ...

  5. Java实现的词频统计——Web迁移

    本次将原本控制台工程迁移到了web工程上,依旧保留原本控制台的版本. 需求: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件: 2.在页面上给出链接 (如果有封皮.作者.字数.页数等信息 ...

  6. java词频统计——web版支持

    需求概要: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件. 2.用户直接输入要统计的文本,服务器返回结果 3.在页面上给出链接 (如果有封皮.作者.字数.页数等信息更佳)或表格,展示经 ...

  7. java词频统计——改进后的单元测试

    测试项目 博客文章地址:[http://www.cnblogs.com/jx8zjs/p/5862269.html] 工程地址:https://coding.net/u/jx8zjs/p/wordCo ...

  8. Java实现的词频统计——功能改进

    本次改进是在原有功能需求及代码基础上额外做的修改,保证了原有的基础需求之外添加了新需求的功能. 功能: 1. 小文件输入——从控制台由用户输入到文件中,再对文件进行统计: 2.支持命令行输入英文作品的 ...

  9. Java实现中文词频统计

    昨日有个中文词频统计的需求, 百度一番后, 发现一大堆标题党文章, 讲的与内容严重不符, 这里就简单记录下自己实现的流程吧! 与英文单词的词频统计不同, 中文的难点在于如何分词, 不过好在有许多优秀的 ...

随机推荐

  1. Ubuntu16.04中用et对jmeter生成的数据统计成图表

    在Ubuntu系统中,用ctrl+Alt+t 打开终端: 输入et,即打开wps: 整理需要形成图表的数据,如: 用excel生成图表,如下: 表得出的性能图表,方法: 1.工具栏中选择插入——二维折 ...

  2. [转]总结一下CSS中的定位 Position 属性

    在CSS中,Position 属性经常会用到,主要是绝对定位和相对定位,简单的使用都没有问题,尤其嵌套起来,就会有些混乱,今记录总结一下,防止久而忘之. CSS position 属性值: absol ...

  3. 一个UUID生成算法的C语言实现——WIN32版本

    源: 一个UUID生成算法的C语言实现——WIN32版本

  4. WCF服务类的实例模式(本文为转载)

    WCF开发时如何选择正确的实例模式(InstanceMode)?   在使用WCF实例模型时,你是否思考过这几个的问题: ”WCF中的实例模式如何正确应用”? ”使用WCF中的实例模式有何原则可以遵循 ...

  5. 20145324Java课程总结

    20145324课程总结 ●每周读书笔记链接总汇 [第一周](http://www.cnblogs.com/SJZGM10/p/5246770.html) 第二周(不小心删了) [第三周](http: ...

  6. 爬虫之Requests: 让 HTTP 服务人类

    Requests: 让 HTTP 服务人类 虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “ ...

  7. jQuery使用ajaxSubmit()提交表单(在不希望页面跳转的情况下)

    原文:http://www.jb51.net/article/48728.htm ajaxSubmit(obj)方法是jQuery的一个插件jquery.form.js里面的方法,所以使用此方法需要先 ...

  8. STL的其他用法(adjacent_find, find_first_of, sort_heap, merge, binary_search)总结

    2017-08-20 17:26:07 writer:pprp 1.adjacent_find() 下面是源码实现: template <class ForwardIterator> Fo ...

  9. mysql中索引利用情况(explain用法)

    使用explain查看,如下 1.首先创建表test,语句如下 create table test(a int,b varchar(10),c varchar(10)); 2.在表中的a,b都创建索引 ...

  10. JS中函数定义和函数表达式的区别

    摘要: (function() {})();和(function(){}());的区别 Javascript中有2个语法都与function关键字有关,分别是: 函数定义:function Funct ...