这个作业属于哪个课程 | 软工-2018级计算机2班 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 学习使用GITHUB或者码云 |
学号 | 20188450 |
参考文献 | eclipse中使用GIT或者码云(eclipse最新版自带GIT插件) |
参考文献 | 正则表达式的使用 |
文章主体
码云项目地址
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 5 | 15 |
Estimate | 估计这个任务需要多少时间 | 360 | 420 |
Development | 开发 | 120 | 240 |
Analysis | 需求分析 (包括学习新技术) | 30 | 120 |
Design Spec | 生成设计文档 | 30 | 15 |
Design Review | 设计复审 | 5 | 3 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 0 |
Design | 具体设计 | 15 | 30 |
Coding | 具体编码 | 100 | 240 |
Code Review | 代码复审 | 15 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 45 |
Reporting | 报告 | 40 | 30 |
Test Repor | 测试报告 | 60 | 20 |
Size Measurement | 计算工作量 | 0 | 0 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 15 | 5 |
合计 | 855 | 1213 |
解题思路描述
第一步判断输入参数,第二步判断输入文件和输出文件是否存在,输入文件不存在则结束程序输出提示信息。输出文件不存在则依照参数创建一个新的输出文件。
调用Lib类的方法实现具体功能:
- numberOfCharacters(File inputFile):统计文件的字符数;
* 只需要统计Ascii码,汉字不需考虑
* 空格,水平制表符,换行符,均算字符
通过FileReader的read()的返回值判断是否是ASCII字符,因为英文的字母数字符号用ASCII表示为0-255。
- numberOfWord(File inputFile):统计文件的单词总数;
* 至少以4个英文字母开头,跟上字母数字符号
* 单词以分隔符分割
* 不区分大小写
直接一次性把文件全读进内存。用正则表达式拆分文本得到待选单词。对待选单词进行条件判断:是否至少以4个英文字母开头,满足则转化为小写保存在wordsArray中。对删选出来的单词进行排序、去重。得到无重复单词的数量。
String[] words=inputTxt.split(regex);
//满足条件(至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割)的单词集合
ArrayList<String> wordsArray=new ArrayList<String>();
for(String temp:words) {
if(temp.length()>=4&&temp.matches("^[A-Za-z]{4,}[A-Za-z0-9]{0,}")) {
//保存为小写
wordsArray.add(temp.toLowerCase());
}
}
- numberOfEffectiveRows(File inputFile):统计文件的有效行数;
*任何包含非空白字符的行,都需要统计。
按行读取文本,如果不包含非空字符且字符长度不等于0则认为是有效行。
- top10Words(File inputFile):统计文件中各单词的出现次数,最终只输出频率最高的10个;
* 频率相同的单词,优先输出字典序靠前的单词。
* 输出的单词统一为小写格式。
直接一次性把文件全读进内存。用正则表达式拆分文本得到待选单词。对待选单词进行条件判断:是否至少以4个英文字母开头,满足则转化为小写保存在wordsArray中。对排好序的wordsArray进行查重,统计每个单词出现的次数,借助WordOcc类(保存单词字符串和单词出现次数)。对去重的topWords进行降序排序,截取前十个出现次数最高的单词返回。
//对拍好序的word进行查重,统计每个单词出现的次数
ArrayList<WordOcc> topWords=new ArrayList<WordOcc>();
String preWord=wordsArray.get(0);
WordOcc newWord=new WordOcc(wordsArray.get(0));
topWords.add(newWord);
for(int i=1;i<wordsArray.size();i++) {
if(!preWord.equals(wordsArray.get(i))) {
preWord=wordsArray.get(i);
newWord=new WordOcc(wordsArray.get(i));
topWords.add(newWord);
}else {
topWords.get(topWords.size()-1).occ++;
}
}
代码规范制定链接:制定的代码规范——《码出高效_阿里巴巴Java开发手册》
设计与实现过程
性能改进
读取文件一开始想到的是FileReader一个字节一个字节的读,但是其实有一次读取整个文本的输入流:FileInputStream。而且速度很快。
单元测试
从网络上随意copy了几篇文章用作测试文件。自己输入测试了可能出现的异常文本。关于作业要求中提出来的这方面的要求我不是很懂。
异常处理说明
java自带异常处理,所有我只增加了一些中文提示。
心路历程与收获
学习到了如何使用eclipse和码云进行代码同步。还学习到了许多并不怎么了解的java类,比如文件输入流FileInputStream。有什么不会的就百度,毕竟现在知识面不广,百度很多新东西,提高性能什么的都挺有帮助的。