WordCount( Java )
Github项目地址:https://github.com/Sabot1203/WordCount
一. 题目描述
- 实现一个简单而完整的软件工具(源程序特征统计程序)。
- 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
- 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。
二.项目要求
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:
程序处理用户需求的模式为:wc.exe [parameter] [file_name]
三.解题思路
- 题目涉及文件的读取解析,选择java程序设计语言主要使用io流部分知识解决较为简单。
- 关于java程序转化为exe文件,及命令参数存储在args中相关知识参考网上知识即可解决
四.设计实现及代码说明
将各功能模块封装进WordCount类,再由主函数调用实现相应功能
选用BufferedInputStream和BufferedOutputStream,利用缓冲可以加快效率和速度
实现流程为:
- 读取文件信息
- 处理文件信息
- 将结果写入文件
public class WordCount {
//统计字符数
public void CountChars() throws IOException
{
...
}
//统计总行数
public void CountLines() throws IOException
{
...
}
//返统计总词数
public void CountWords() throws IOException
{
...
}
//统计 代码行/空行/注释行 的行数
public void CountLinesByKind()throws IOException
{
...
}
//使用停用词文件 统计单词个数
public void CountWordsWithLimite() throws IOException
{
...
}
}
关键代码:
public class Main {
· · ·
public static void analyseCommand(String[] args) throws IOException
{
· · ·
if(args.length==0)//需要用户输出参数
{
System.out.println("Command codes are needed !");
}
else
{
for(int i=0;i<args.length;i++)
{
commands.add(args[i]);
if(!args[i].matches("^-.*"))//不是命令符号
{
if(args[i].contains("."))//是文件名或目录
{
if(!new File(args[i]).exists())//文件不存在
{
System.out.println("The file named "+args[i]+" does not exist");
System.exit(0);
}
else
{
commandsList.add(commands);
commands=new ArrayList<>();
}
}
else//指令有错
{
System.out.println("The "+(i+1)+"th code("+args[i]+") must begin with '-'");
System.exit(0);
}
}
}
}
commandAction(commandsList);
}
public static void commandAction(List<List<String>> commandList) throws IOException
{
· · ·
for(List<String> commands:commandList)
{
if(commands.contains("-o"))
{
output=commands.get(commands.size()-1);
}
else if(commands.contains("-e"))
{
stop=commands.get(commands.size()-1);
}
else
{
input=commands.get(commands.size()-1);
}
}
WordCount wc=new WordCount(input,stop,output);
for(List<String> commands:commandList)
{
for(int i=0;i<commands.size()-1;i++)
{
switch(commands.get(i))
{
case "-c":wc.CountChars();
break;
case "-w":wc.CountWords();
break;
case "-l":wc.CountLines();
break;
case "-s":wc.CountLinesByKind();
break;
case "-e":wc.CountWordsWithLimite();
break;
case "-o":break;
default:System.out.println("No such command code");
}
}
}
}
}
//代码行/空行/注释行 的行数
public void CountLinesByKind()throws IOException
{
. . .
while((strLine=input.readLine())!=null)
{
all_lines++;
strLine.replaceAll("\r", "");//去除换行符和空格 便于后面操作
strLine.replaceAll("\n", "");
strLine=strLine.trim();
strLine.replaceAll(" ", "");
if(InNoteLines==true)
{
note_lines++;
if(strLine.endsWith("*/")||strLine.endsWith("*/}"))
{
InNoteLines=false;
}
}
else if(strLine.startsWith("/*")||strLine.startsWith("{/*")) //进入注释行
{
note_lines++;
if(!strLine.endsWith("*/")&&!strLine.endsWith("*/}"))//本行未注释结束
{
InNoteLines=true;
}
}
else if(strLine.startsWith("//")||strLine.startsWith("{//"))
{
note_lines++;
}
else if(strLine.equals("")||strLine.equals("{")||strLine.equals("}"))
{
blank_lines++;
}
}
code_lines=all_lines-blank_lines-note_lines;
...
}
五.测试运行
我们建立起一系列测试文件。如下:
- 空文件
- 只有一个字符的文件
- 只有一个词的文件
- 只有一行的文件
- 一个典型的源文件

测试结果如下:





六.项目总结
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 15 |
| · Estimate | · 估计这个任务需要多少时间 | 300 | 320 |
| Development | 开发 | 230 | 275 |
| · Analysis | · 需求分析 (包括学习新技术) | 30 | 15 |
| · Design Spec | · 生成设计文档 | 10 | 10 |
| · Design Review | · 设计复审 (和同事审核设计文档) | 10 | 5 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
| · Design | · 具体设计 | 10 | 10 |
| · Coding | · 具体编码 | 120 | 180 |
| · Code Review | · 代码复审 | 10 | 15 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 30 | 20 |
| Reporting | 报告 | 40 | 30 |
| · Test Report | · 测试报告 | 20 | 10 |
| · Size Measurement | · 计算工作量 | 10 | 10 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 10 |
| 合计 | 300 | 320 |
计划计划时间比实际计划时间短,动手开发时间比计划开发时间长
WordCount( Java )的更多相关文章
- 个人项目:WordCount (Java)
一.Github项目地址 https://github.com/misterchaos/WordCount 二.解题思路 2.1 基本需求分析 经过仔细阅读题目,分析得出项目的基本需求如下: wc.e ...
- WordCount(Java实现)
Github项目地址:https://github.com/linzworld/word-count 项目相关要求 题目描述 Word Count 实现一个简单而完整的软件工具(源程序特征统计程序). ...
- 大数据之路week07--day03(Hadoop深入理解,JAVA代码编写WordCount程序,以及扩展升级)
什么是MapReduce 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃. MapReduce方法则是: 1.给在座的所有玩家中分配这摞牌 2.让每个玩家数自己手中的牌有几 ...
- Eclipse 执行成功的 Hadoop-1.2.1 WordCount 源码
万事开头难.最近在学习Hadoop,先是搭建各种版本环境,从2.2.0到2.3.0,再到1.2.1,终于都搭起来了,折腾了1周时间,之后开始尝试使用Eclipse编写小demo.仅复制一个现成的Wor ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 【hadoop】——修改hadoop FileUtil.java,解决权限检查的问题
在Hadoop Eclipse开发环境搭建这篇文章中,第15.)中提到权限相关的异常,如下: 15/01/30 10:08:17 WARN util.NativeCodeLoader: Unable ...
- hadoop的统计单词程序WordCount提示找不到WordCount类
按这里的教程: http://www.imooc.com/learn/391 试验时,发现在wordcount的最后一步一直提示如下错误: Exception in thread "main ...
- 开源分布式实时计算引擎 Iveely Computing 之 WordCount 详解(3)
WordCount是很多分布式计算中,最常用的例子,例如Hadoop.Storm,Iveely Computing也不例外.明白了WordCount在Iveely Computing上的运行原理,就很 ...
- Hadoop入门程序WordCount的执行过程
首先编写WordCount.java源文件,分别通过map和reduce方法统计文本中每个单词出现的次数,然后按照字母的顺序排列输出, Map过程首先是多个map并行提取多个句子里面的单词然后分别列出 ...
随机推荐
- 使用ATOMac进行Mac自动化测试
ATOMac简介 atomac是一个支持在mac上做自动化的python库,GitHub地址如下: https://github.com/pyatom/pyatom 安装 # Python2 sudo ...
- Python File flush() 方法
概述 flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入.高佣联盟 www.cgewang.com 一般情况下,文件关闭后会自动刷 ...
- PHP is_callable() 函数
is_callable() 函数用于检测函数在当前环境中是否可调用.高佣联盟 www.cgewang.com is_callable() 函数验证变量的内容能否作为函数调用. 这可以检查包含有效函数名 ...
- Skill 脚本演示 ycSetNetColor.il
https://www.cnblogs.com/yeungchie/ ycSetNetColor.il 将原理图中某一 netName 的所有连线同时修改为一种 颜色 / 线宽. 回到目录
- Skill 计算两点距离
https://www.cnblogs.com/yeungchie/ code procedure(ycHowFar(a b) prog((xAB yAB sAB) xAB = xCoord(a) - ...
- linux的文件处理(匹配 正则表达式 egrep awk sed)和系统、核心数据备份
文件处理 1.处理方式 匹配 正则表达式 egrep awk sed 2.文件中的处理字符 \n 新行符 换行 \t 制表符 tab键 缺省8个空格 \b 退格符 backspace键 退格键 ...
- 【CF600E】Lomset gelral 题解(树上启发式合并)
题目链接 题目大意:给出一颗含有$n$个结点的树,每个节点有一个颜色.求树中每个子树最多的颜色的编号和. ------------------------- 树上启发式合并(dsu on tree). ...
- jquery的父级和兄弟级能做多少网页特效
这里说的父级就是parent 兄弟级就是siblings 我这里说一个导航栏用到的特效 主要jquery代码$(this).parent().addClass(“active”).siblings( ...
- python6.1创建类
class Dog(object): type1="宠物"#类变量 #初始化方法 def __init__(self,name,age,color): self.name=name ...
- LinuX操作系统基础------> 用户管理,grep搜索
用户管理 用户组管理 字符管理和grep搜索 1.用户管理: LinuX是一个多用户,多任务的操作系统,可以让多个用户使用,这个账号可以帮助对用户进行追踪,必须在初始化的时候设置好自己的密码 1-1配 ...