WordCount个人项目
1.GitHub地址:https://github.com/lyh27/WordCount
2、题目描述
Word Count
1. 实现一个简单而完整的软件工具(源程序特征统计程序)。
2. 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
3. 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。
2.1 WC 项目要求
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:
程序处理用户需求的模式为:
wc.exe [parameter] [file_name]
基本功能列表:
wc.exe -c file.c //返回文件 file.c 的字符数
wc.exe -w file.c //返回文件 file.c 的词的数目
wc.exe -l file.c //返回文件 file.c 的行数
扩展功能:
-s 递归处理目录下符合条件的文件。
-a 返回更复杂的数据(代码行 / 空行 / 注释行)。
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
代码行:本行包括多于一个字符的代码。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
} //注释
在这种情况下,这一行属于注释行。
3.解题思路
使用语言为JAVA,拿到题目要从电脑中获取文件,则需要利用到JAVA内部提供的BufferedReader来读取文件的内容,便于获取到所需要的行数,字符数,单词数等各种信息。然后通过用户的输入,来执行命令。本项目采取到了main函数中的args[]来输入代码。
4.设计实现过程
1.首先我利用了一个工具包Util,在里面分成了4个类,分别是CharLengthUtil,WordCountUtil,LineCountUtil,OtherLineCountUtil,里面分别实现了字符数的统计,单词的统计,行统计,以及包括空行,注释行,代码行的统计。
2.主函数main,设计用户的输入,调用方法。
5.具体的代码说明:
首先是CharLengthCountUtil
- package wc.util;
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
- public class CharLengthUtil {
- //实现字符的统计
- public static int CharLength(String filename){
- int countChar=0;
- String sentence;
- BufferedReader br=null;
- try {
- br = new BufferedReader(new FileReader(filename));
- while((sentence = br.readLine())!= null)
- //去除句子中的空格,以免加入到字符的统计
- countChar += sentence.replace(" ","").length();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- finally {
- try {
- br.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return countChar;
- }
- }
WordCountUtil
- package wc.util;
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
- public class WordCountUtil {
- //实现单词的统计
- public static int WordCount(String filename) {
- int wordCount=0;
- String sentence;
- BufferedReader br=null;
- try {
- br = new BufferedReader(new FileReader(filename));
- while((sentence=br.readLine())!=null) {
- //将句子中的逗号,句号,问号,感叹号等替换成空格,方便统计单词个数
- sentence =sentence.replace(",", " ");
- sentence =sentence.replace("."," ");
- sentence =sentence.replace("?"," ");
- sentence =sentence.replace("!"," ");
- wordCount += sentence.split(" ").length;
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- finally {
- try {
- br.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return wordCount;
- }
- }
LineCountUtil
- package wc.util;
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
- public class LineCountUtil {
- //实现行的统计
- public static int LineCount(String filename) {
- int line=0;
- BufferedReader br=null;
- try {
- br = new BufferedReader(new FileReader(filename));
- while(br.readLine()!=null)
- line++;
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- finally {
- try {
- br.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return line;
- }
- }
OtherLineUtil
- package wc.util;
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
- public class OtherLineCountUtil {
- //实现空行,代码行,注释行的统计
- public static String OtherLineCount(String filename) {
- // TODO Auto-generated method stub
- int codeLine=0;
- int emptyLine=0;
- int noteLine=0;
- String sentence;
- BufferedReader br=null;
- String result;
- boolean inNoteLine=false;
- try {
- br = new BufferedReader(new FileReader(filename));
- while((sentence=br.readLine())!=null){
- //统计/*的注释行
- if(inNoteLine==true) {
- noteLine++;
- if(sentence.endsWith("*/")||sentence.endsWith("*/}"))
- inNoteLine=false;
- continue;
- }
- if(sentence.startsWith("/*")||sentence.startsWith("{/*")) {
- noteLine++;
- if(!sentence.endsWith("*/")||!sentence.endsWith("*/}"))
- inNoteLine=true;
- continue;
- }
- //统计//的注释行
- if(sentence.startsWith("//")||sentence.startsWith("{//")) {
- noteLine++;
- continue;
- }
- //空行的统计
- if(sentence.equals("")||sentence.equals("{")||sentence.equals("}")||sentence.equals(" ")) {
- emptyLine++;
- continue;
- }
- //都不是的情况下统计代码行
- codeLine++;
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- result=Integer.toString(codeLine)+"/"+Integer.toString(emptyLine)+"/"+Integer.toString(noteLine);
- return result;
- }
- }
Main方法
- package wc.main;
- import java.util.ArrayList;
- import java.util.List;
- import wc.util.CharLengthUtil;
- import wc.util.LineCountUtil;
- import wc.util.OtherLineCountUtil;
- import wc.util.WordCountUtil;
- public class WCmain {
- //基于main函数中的args的指令输入
- public static void main(String[] args) {
- List<String> filenames =new ArrayList<>(); //利用集合存储文件
- List<String> commands =new ArrayList<>(); //存储指令
- for(int i=0;i<args.length;i++) {
- if(args[i].startsWith("-"))
- commands.add(args[i]);
- else {
- filenames.add(args[i]);
- }
- }
- for(int j=0;j<commands.size();) {
- switch(commands.get(j)) {
- case "-c" :
- System.out.println("字符数为:" + CharLengthUtil.CharLength(filenames.get(filenames.size()-1)));
- break;
- case "-w" :
- System.out.println("单词数为:" + WordCountUtil.WordCount(filenames.get(filenames.size()-1)));
- break;
- case "-l" :
- System.out.println("行数为:" + LineCountUtil.LineCount(filenames.get(filenames.size()-1)));
- break;
- case "-a" :
- System.out.println("代码行/空行/注释行:" + OtherLineCountUtil.OtherLineCount(filenames.get(filenames.size()-1)));
- break;
- case "-s" :
- for(int i=0;i<filenames.size();i++) {
- System.out.println(filenames.get(i));
- System.out.println("字符数为:" + CharLengthUtil.CharLength(filenames.get(i)));
- System.out.println("单词数为:" + WordCountUtil.WordCount(filenames.get(i)));
- System.out.println("行数为:" + LineCountUtil.LineCount(filenames.get(i)));
- System.out.println("代码行/空行/注释行:" + OtherLineCountUtil.OtherLineCount(filenames.get(i)));
- }
- default:
- System.out.println("您的输入有误,请重新输入");
- }
- break;
- }
- }
- }
6.测试结果
测试用例:
1.-c
2.-w
3.-l
4.-a
5.-s
7.PSP结果
|
Personal Software Process Stages | 预估耗时(分钟) |
|
||
Planning | 计划 | 20 | 15 | ||
Estimate | 估计这个任务需要多少时间 | 500 | 460 | ||
Development | 开发 | 450 | 460 | ||
Analysis | 需求分析 (包括学习新技术) | 100 | 120 | ||
Design Spec | 生成设计文档 | 30 | 35 | ||
Design Review | 设计复审 (和同事审核设计文档) | 10 | 5 | ||
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 0 | 0 | ||
Design | 具体设计 | 10 | 10 | ||
Coding | 具体编码 | 430 | 420 | ||
Code Review | 代码复审 | 60 | 50 | ||
Test | 测试(自我测试,修改代码,提交修改) | 20 | 15 | ||
Reporting | 报告 | 10 | 15 | ||
Test Report | 测试报告 | 20 | 15 | ||
Size Measurement | 计算工作量 | 10 | 5 | ||
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 10 | 15 | ||
Sum | 合计 | 560 | 585 |
8.项目总结
这不是一个完整的项目,代码质量不算高,这次使用了较少使用的JAVA语言,在开发过程中无法做到尽善尽美,很多东西都要学习很久才能动手,但这也进一步锻炼我JAVA的编程能力,项目中的规范仍然不够,且仍然存在bug,例如:对于空文件还未进行处理,还未给出图形化的界面,以及还没有指导用户输入,以及还未解决空格算入字符数,单词数还不够准确的问题,总体来说还不够熟练,不过这应该算我第一个大致的JAVA项目,接下来还需要继续学习提高,利用PSP也提高了我的规划能力,提高我的效率。对于JAVA还要学习东西很多,我还必须进一步地提高自我,不断学习,Swing编程未涉及,以至于还无法做出图形化界面,技术还差很多。
9.参考资料
java统计一个文件的字符数,单词数,行数:https://blog.csdn.net/ycy0706/article/details/45457311
java的io流操作中BufferedReader的作用:https://blog.csdn.net/qq_40207805/article/details/78367916
Java中main方法参数String[] args的使用:https://www.cnblogs.com/xy-hong/p/7197725.html
Java startsWith() 方法:https://www.runoob.com/java/java-string-startswith.html
WordCount个人项目的更多相关文章
- WordCount结对项目
合作者:201631062124,201631062423 代码地址:https://gitee.com/yryx/WordCount 作业地址:https://edu.cnblogs.com/cam ...
- WordCount测试项目小结
一.本文对应项目GitHub地址 https://github.com/ReWr1te/WCProject 请参照最新版本(WCProject4.0) 二.项目PSP表格 PSP2.1 PSP阶段 预 ...
- MapReduce第一个项目 WordCount
参考自林子雨大数据教学: http://dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/ 创建一个文件夹:放入一个文本文件:填 ...
- 结对作业——WordCount进阶版
Deadline: 2018-10-7 22:00PM,以博客提交至班级博客时间为准 要求参考来自:https://www.cnblogs.com/xinz/archive/2011/11/27/22 ...
- MapReduce 单词统计案例编程
MapReduce 单词统计案例编程 一.在Linux环境安装Eclipse软件 1. 解压tar包 下载安装包eclipse-jee-kepler-SR1-linux-gtk-x86_64.ta ...
- Word Count(C语言)
1.项目地址 https://github.com/namoyuwen/word-count 2.项目相关要求 2.1 项目描述 Word Count 1. 实现一个简单而完整的软件工具(源程序 ...
- Storm系列(三):创建Maven项目打包提交wordcount到Storm集群
在上一篇博客中,我们通过Storm.Net.Adapter创建了一个使用Csharp编写的Storm Topology - wordcount.本文将介绍如何编写Java端的程序以及如何发布到测试的S ...
- WordCount项目基本功能
一.项目源代码地址 本人Gitee项目地址:https://gitee.com/yuliu10/WordCount 二.PSP表格 psp阶段 预估耗时 (分钟) 实际耗时 (分钟) 计划 30 10 ...
- 结对项目-WordCount
结对作业: 成员:201631062115(me),201631062613(partner) 代码地址:https://gitee.com/ackary/WordCount 作业的链接地址:http ...
随机推荐
- Ceph的Mon数据重新构建工具
关于mon的数据的问题,一般正常情况下都是配置的3个mon的,但是还是有人会担心 Mon 万一三个同时都挂掉了怎么办,那么集群所有的数据是不是都丢了,关于后台真实数据恢复,有去后台取对象,然后一个个拼 ...
- 关于多线程--网络编程 -- 注解反射的一点笔记(JAVA篇)
一 . 线程 java开启一个线程的方法(三种) 方法一:继承Thread类并New一个线程对象 步骤: 1):定义一个类A继承于Java.lang.Thread类. class TestThread ...
- 建议收藏,从零开始创建一个Activiti工作流,手把手教你完成
环境配置 项目环境: JDK1.8 tomcat7 maven3.5 开发工具: IDEA activiti7 创建项目 目标:创建一个maven项目,集成Activiti,并自动生成25张数据库表 ...
- 我要进大厂之大数据ZooKeeper知识点(1)
01 让我们一起学大数据 老刘又回来啦!在实验室师兄师姐都找完工作之后,在结束各种科研工作之后,老刘现在也要为找工作而努力了,要开始大数据各个知识点的复习总结了.老刘会分享出自己的知识点总结,一是希望 ...
- FTP漏洞利用复现
目录 FTP弱口令漏洞 FTP后门漏洞利用 FTP弱口令漏洞 漏洞描述 FTP弱口令或匿名登录漏洞,一般指使用FTP的用户启用了匿名登录功能,或系统口令的长度太短.复杂度不够.仅包含数字.或仅包含字母 ...
- phpstudy搭建网站只能访问首页,其他路由访问404
今天博主遇到了一个很奇葩的问题,电脑下载了一个phpstudy搭建网站,框架用的是tp,但是除了输入域名能访问,其他页面都访问不了 经过博主的疯狂问大佬,以及百度,终于解决了这个问题 这次出现问题的原 ...
- scala中的val,var和lazy
转自:https://yerias.github.io/2020/03/19/scala/3/#3%EF%BC%9Alazy%E4%BF%AE%E9%A5%B0%E7%AC%A6%E5%8F%AF%E ...
- 面试阿里,腾讯,字节跳动90%都会被问到的Spring中的循环依赖
前言 Spring中的循环依赖一直是Spring中一个很重要的话题,一方面是因为源码中为了解决循环依赖做了很多处理,另外一方面是因为面试的时候,如果问到Spring中比较高阶的问题,那么循环依赖必定逃 ...
- 移动端调试Web页面
移动端调试Web页面 虽然可以在PC下,通过开发者工具,模拟移动端,但是这样只能模拟页面样式,对于代码的执行情况是无法模拟的,所以在此结合实际调试经验,针对安卓与IOS设备,进行总结. IOS 安卓 ...
- 通过Folx的排序功能来设置下载任务的优先级
当我们使用Folx进行多任务下载时,突然遇到要下载一个紧急文件的情况,该如何让这个紧急文件的下载任务排在优先的位置?当然,用户也可以先暂停所有的下载任务,仅开启紧急文件的下载任务. 但这种方式需要用户 ...