个人项目:WordCount (Java)
一、Github项目地址
https://github.com/misterchaos/WordCount
二、解题思路
2.1 基本需求分析
经过仔细阅读题目,分析得出项目的基本需求如下:
wc.exe -c //返回文件 file.c 的字符数 |
---|
wc.exe -c //返回文件 file.c 的字符数 |
wc.exe -w //返回文件 file.c 的词的数目 |
wc.exe -l //返回文件 file.c 的行数 |
wc.exe -a //返回更复杂的数据(代码行 / 空行 / 注释行) |
wc.exe -s //递归处理目录下符合条件的文件。 |
wc.exe -x //显示图形界面 |
2.2 实现思路
因为本项目需要制作图形化界面,以及需求用到比较多的字符串操作,综合考虑开发效率和程序运行效率,最终选择Java作为开发语言,使用Javafx进行图形界面开发。因为之前没有做过Javafx项目,所以需要去找一份Javafx的使用教程进行学习。整体上项目需要具备解析控制台输入的指令的功能,读取文件的功能,统计文本信息的功能,图形化界面的功能等。
三、设计方案
3.1 系统架构
使用基本的MVC结构:
3.2 系统流程图
系统流程图如下:
四、项目难点
4.1 如何准确地统计文件中的信息
使用逐行遍历的方式,统计每一行中的字符数,单词数等,最后汇总得到总行数,总的字符数,单词数等信息。
4.2 如何构建图形界面
使用scenebuilder构建基本的图形界面。
4.3 如何递归遍历查找文件夹中符合通配符的文件。
将用户输入的通配符转成正则表达式,递归获取当前目录下的所有文件,逐一进行文件名的匹配,得到符合条件的文件。
五、代码说明
/**
* 核心统计方法
*
* @param reader
* @return
* @throws IOException
*/
private static CountResult count(BufferedReader reader) throws IOException {
CountResult result = new CountResult();
String character = "\\w";
String word = "[a-zA-Z]+";
String line;
//多行注释
boolean isAnnotation = false;
while ((line = reader.readLine()) != null) {
//统计一行中的字符数
result.character += CountUtil.count(line, character);
//统计一行中的单词数
result.word += CountUtil.count(line, word);
//统计行数
result.line++;
//统计空行,代码行,注释行
if (line.trim().isEmpty()) {
//空行
result.emptyLine++;
//开始多行注释
} else if (isAnnotation) {
result.annotationLine++;
//多行注释结束
if (line.trim().endsWith("*/")) {
isAnnotation = false;
}
} else if (line.trim().contains("//") || line.trim().contains("*")) {
//注释行
result.annotationLine++;
//如果是行后注释
if (!(line.trim().startsWith("/") || line.trim().startsWith("*"))) {
result.codeLine++;
}
//多行注释开始
if (line.trim().startsWith("/*")) {
isAnnotation = true;
}
} else {
//代码行
result.codeLine++;
}
}
return result;
} /**
* 根据命令行模式下的参数执行
*
* @param args
*/
public static void wc(String[] args) {
long begin = System.currentTimeMillis();
try {
//多文件处理
if (Constant.OPS_S.equals(args[0])) {
if (args.length == 3) {
List<File> files = FileUtil.listFileByRegex(RegexUtil.toRegex(args[2]));
for (File f : files) {
countFile(args[1], f);
}
} else {
throw new Exception("缺少必要的参数,指令示例:-s -a *.c");
}
} else {
//单文件处理
countFile(args[0], new File(args[1]));
}
System.out.println("运行耗时:" + (System.currentTimeMillis() - begin) + "ms");
} catch (Exception e) {
System.out.println("运行出错:" + e.getMessage());
} } /**
* 统计输出一个文件的信息
*
* @param ops 要统计的信息
* @param file 文件名
* @throws Exception
*/
public static void countFile(String ops, File file) throws Exception {
System.out.println("文件信息:" + BeanUtil.getFileInfo(file));
switch (ops) {
case Constant.OPS_C:
System.out.println("字符数:" + countService.countCharacter(file));
break;
case Constant.OPS_W:
System.out.println("单词数:" + countService.countWord(file));
break;
case Constant.OPS_L:
System.out.println("行数:" + countService.countLine(file));
break;
case Constant.OPS_A:
CountResult result = countService.countAll(file);
System.out.println("字符数:" + result.character);
System.out.println("单词数:" + result.word);
System.out.println("行数:" + result.line);
System.out.println("空行数:" + result.emptyLine);
System.out.println("代码行数:" + result.codeLine);
System.out.println("注释行数:" + result.annotationLine);
break;
default:
throw new Exception("无法识别的指令类型:" + ops);
}
}
六、测试结果
6.1 单文件测试
测试文件:
测试结果
6.2 多文件测试
测试文件:
测试结果:
6.3 图形化界面测试
选择文件:
统计结果:
6.4 出错处理测试
文件不存在:
缺少参数:
不识别的指令:
没有找到符合条件的文件:
七、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 5 | 5 |
· Estimate | · 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | 180 | 265 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 60 |
· Design Spec | · 生成设计文档 | 5 | 10 |
· Design Review | · 设计复审 (和同事审核设计文档) | 5 | 5 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
· Design | · 具体设计 | 5 | 5 |
· Coding | · 具体编码 | 120 | 150 |
· Code Review | · 代码复审 | 5 | 10 |
· Test | · 测试(自我测试,修改代码,提交修改) | 5 | 20 |
Reporting | 报告 | 15 | 25 |
· Test Report | · 测试报告 | 5 | 10 |
· Size Measurement | · 计算工作量 | 5 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 5 | 5 |
合计 | 200 | 295 |
八、项目小结
这次的项目带给我最大的不同是使用了PSP表格去管理自己的时间,从实际的结果来看,实际的耗时比自己的计划都会稍微多一些,主要是有一些问题不在预期之内,而且在编写代码的过程中也不断有新的想法产生,就会产生更多的需求。耗时比较多的地方是图形化界面的表格,一开始只是做一个显示单文件信息的界面,后来觉得想做多文件的,就又去学了javafx表格的使用,Javafx做表格确实有点麻烦,花了一些时间去学习它的使用,总体来说收获还是挺多的。
个人项目:WordCount (Java)的更多相关文章
- 个人项目WordCount(C++/QT)
个人项目WordCount(C++/QT) GitHub项目地址:https://github.com/Nova-cjp/Word-Count 百度云链接:https://pan.baidu.com/ ...
- [转载]将别人的项目或JAVA文件导入到自己的Eclipse中时,常常会出现JAVA文件的中文注释变成乱码的情况,解决办法
eclipse 代码中文注释乱码 求解决 将别人的项目或JAVA文件导入到自己的Eclipse中时,常常会出现JAVA文件的中文注释变成乱码的情况,主要原因就是别人的IDE编码格式和自己的Eclips ...
- Java web项目引用java项目,类型找不到
Java web项目引用java项目,类型找不到 错误信息: java.lang.ClassNotFoundException: org.codehaus.jackson.map.ObjectMapp ...
- ubuntu下eclipse新建项目没有java project的解决办法
装好了eclipse之后却发现新建项目没有java project的选项,大致搜索了一下,并没有发现很好的解决方案(大都是让你重新安装什么的),于是开始瞎鼓捣,并且找到了一个方案: 在终端切换到roo ...
- Maven项目中java类报错-Cannot resolve symbol
电脑蓝屏了,强制重启之后再打开IDEA里面的项目,所有Java类文件都在报Cannot resolve symbo错误,可以确定所有依赖的包都有引用且jar包没有冲突. 经查询找到这个解决方法: 在I ...
- 【MyEcplise】导入项目报错:Errors running builder 'JavaScript Validator' on project '项目名'. java.lang.ClassCastException
导入项目报错:Errors running builder 'JavaScript Validator' on project '项目名'. java.lang.ClassCastException ...
- 个人项目-WC (java实现)
一.Github地址:https://github.com/734635746/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...
- eclipse spring boot 项目出现java.lang.ClassCastException 解决方法
问题 eclipse spring boot 项目出现java.lang.ClassCastException 解决方法: 重新生成项目
- Java Web项目与Java项目的区别
一.以下是我对Java Web项目和Java项目这两者的理解以及区别: 1.Java Web项目是基于Java EE类的:而Java项目是基于Java应用程序的. 2.Java Web项目是网页的编码 ...
随机推荐
- 关于使用map存放数据乱序”问题“
今天做项目中遇到了一个比较低级的错误,如果没注意将会变的更麻烦... 其实吧,也不难,要求就是将list中的值转为map后,再顺序输出map中的值,list的顺序怎样,加入到map的顺序也应怎样,不能 ...
- 第八章、小节三keep-alive
主要缓存的是ajax中的json 我的路由中的内容被加载过一次,我就把路由中的内容放到内存中,下次再进入这个路由的时候,不需要重新加载页面,直接从内存中获取数据. 切换不同城市,调用不同城市数据 但是 ...
- web前端问题整理
1.常用那几种浏览器测试?有哪些内核(Layout Engine)? (Q1)浏览器:IE,Chrome,FireFox,Safari,Opera (Q2)内核:Trident,Gecko,Prest ...
- AX2012/D365 SSRS报表开发
大家好,好久没有做SSRS报表了,近期刚好有做2张,就整理起来供初学者参考. AX中SSRS报表开发的框架,父类非常多,这里跟大家简单分享2种比较常用的场景供大家使用. 1.简单的过滤字段,无特殊过滤 ...
- C语言程序设计(三) 简单的算术运算和表达式
第三章 简单的算术运算和表达式 算数运算符:一元.二元.三元(条件运算符) 1/2是整型除法,1.0/2是浮点数除法 求余运算(%)限定参与运算的两个操作数必须为整数,不能对两个实型数据进行求余运算 ...
- 5W2H方法:七问分析法
5W2H分析方法也叫七问分析法,是二战中美国陆军兵器修理部首创.简单.方便.易于理解.使用,富有启发意义,被广泛应用于企业管理和技术活动,对于决策和执行性的措施也非常有帮助,有助于弥补考虑问题的疏漏. ...
- 写于疫情期间的一个plantUML例子
@startuml 这几天的正经事 start repeat if(思维清晰) then (yes) :刷题; else (no) if(想写程序) then (yes) :调项目; else (no ...
- Angular入门之环境搭建(VS code)(转载)
安装Visual Studio Code VS code和我们常用的VS压根不是一回事,它只是一个开源的轻量级编辑器,而不是IDE,因为支持typescript语法,且插件功能丰富,所以选择 官网下载 ...
- yield 语法备忘录
yield 语法备忘录 yield 语法备忘录 语法 .net yield 读作:“一有得” 英式发音 皮一下~ yield 关键字向编译器指示它所在的方法是迭代器块. 编译器生成一个类来实现 ...
- 启动崩盘!IDEA 2020 无法启动的解决办法|赠送 IDEA 2020 新功能
今天早上看到 IDEA 可以升级新版本,想着体验一下新功能,点击升级,然后全部项目工程无法打开. 报错信息如下: Cannot execute command No project found to ...