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并行提取多个句子里面的单词然后分别列出 ...
随机推荐
- Tomcat Script(python)
由于刚接触 Python,所以使用Python 书写一些小的脚本,进行备忘同时分享给大家 #!/usr/bin/env python # _*_coding:utf-8_*_ # author: 'l ...
- 萌新学渗透系列之Hack The Box_Legacy
我将我的walkthrough过程用视频解说的形式记载 视频地址https://www.bilibili.com/video/BV1mZ4y1u7jG 一是因为看我视频的后来者应该都是刚入门的新手,视 ...
- Seaborn基础1
import seaborn as sns import numpy as np import matplotlib.pyplot as plt # # 折线图 def sinplot(flip = ...
- PHP pclose() 函数
定义和用法 pclose() 函数关闭由 popen() 打开的进程. 如果失败,该函数返回 FALSE. 语法 pclose(pipe) 参数 描述 pipe 必需.规定由 popen() 打开的进 ...
- 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.
考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...
- webapp项目新建java class、webapp目录树结构
上一篇中我们介绍了IDEA.maven新建webapp项目的两种方式,分别是:在命令行中用模板创建.直接在IDEA中选择骨架创建. 但都存在一个问题:目录树不完整.有些人会不知道接下来该如何创建j ...
- 关于c/c++指针,指针的指针
伪军迷祝:建军节快乐! 当调用一个函数时,实际上入参使用的都是副本(除非是引用),指针也不例外.举个例子如: void func(int a, int * p); 当调用func时无论是a还是p其实传 ...
- java 遍历数组常见的3种方式
1.for循环,最常见 2.利用foreach 3.利用jdk自带的方法 --> java.util.Arrays.toString()
- CSS部分样式知识
css文件 /* 注释内容 */ /* 选择器,其中body就是一个选择器,表示选中个body这个标签 声明块:为选择器设置样式 { 样式名: 样式值; } */ body{ background-c ...
- 用Python绘制一套“会跳舞”的动态图形给你看看
在读技术博客的过程中,我们会发现那些能够把知识.成果讲透的博主很多都会做动态图表.他们的图是怎么做的?难度大吗?这篇文章就介绍了 Python 中一种简单的动态图表制作方法. 看这优美的舞姿 很多人学 ...