Github项目地址:https://github.com/Sabot1203/WordCount

一. 题目描述

  1. 实现一个简单而完整的软件工具(源程序特征统计程序)。
  2. 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
  3. 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。

二.项目要求

  1. wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。

  2. 实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。

  3. 具体功能要求:

    程序处理用户需求的模式为:wc.exe [parameter] [file_name]

三.解题思路

  1. 题目涉及文件的读取解析,选择java程序设计语言主要使用io流部分知识解决较为简单。
  2. 关于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;
... }

五.测试运行

我们建立起一系列测试文件。如下:

  1. 空文件
  2. 只有一个字符的文件
  3. 只有一个词的文件
  4. 只有一行的文件
  5. 一个典型的源文件

测试结果如下:

六.项目总结

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 )的更多相关文章

  1. 个人项目:WordCount (Java)

    一.Github项目地址 https://github.com/misterchaos/WordCount 二.解题思路 2.1 基本需求分析 经过仔细阅读题目,分析得出项目的基本需求如下: wc.e ...

  2. WordCount(Java实现)

    Github项目地址:https://github.com/linzworld/word-count 项目相关要求 题目描述 Word Count 实现一个简单而完整的软件工具(源程序特征统计程序). ...

  3. 大数据之路week07--day03(Hadoop深入理解,JAVA代码编写WordCount程序,以及扩展升级)

    什么是MapReduce 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃. MapReduce方法则是: 1.给在座的所有玩家中分配这摞牌 2.让每个玩家数自己手中的牌有几 ...

  4. Eclipse 执行成功的 Hadoop-1.2.1 WordCount 源码

    万事开头难.最近在学习Hadoop,先是搭建各种版本环境,从2.2.0到2.3.0,再到1.2.1,终于都搭起来了,折腾了1周时间,之后开始尝试使用Eclipse编写小demo.仅复制一个现成的Wor ...

  5. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  6. 【hadoop】——修改hadoop FileUtil.java,解决权限检查的问题

    在Hadoop Eclipse开发环境搭建这篇文章中,第15.)中提到权限相关的异常,如下: 15/01/30 10:08:17 WARN util.NativeCodeLoader: Unable ...

  7. hadoop的统计单词程序WordCount提示找不到WordCount类

    按这里的教程: http://www.imooc.com/learn/391 试验时,发现在wordcount的最后一步一直提示如下错误: Exception in thread "main ...

  8. 开源分布式实时计算引擎 Iveely Computing 之 WordCount 详解(3)

    WordCount是很多分布式计算中,最常用的例子,例如Hadoop.Storm,Iveely Computing也不例外.明白了WordCount在Iveely Computing上的运行原理,就很 ...

  9. Hadoop入门程序WordCount的执行过程

    首先编写WordCount.java源文件,分别通过map和reduce方法统计文本中每个单词出现的次数,然后按照字母的顺序排列输出, Map过程首先是多个map并行提取多个句子里面的单词然后分别列出 ...

随机推荐

  1. Tomcat Script(python)

    由于刚接触 Python,所以使用Python 书写一些小的脚本,进行备忘同时分享给大家 #!/usr/bin/env python # _*_coding:utf-8_*_ # author: 'l ...

  2. 萌新学渗透系列之Hack The Box_Legacy

    我将我的walkthrough过程用视频解说的形式记载 视频地址https://www.bilibili.com/video/BV1mZ4y1u7jG 一是因为看我视频的后来者应该都是刚入门的新手,视 ...

  3. Seaborn基础1

    import seaborn as sns import numpy as np import matplotlib.pyplot as plt # # 折线图 def sinplot(flip = ...

  4. PHP pclose() 函数

    定义和用法 pclose() 函数关闭由 popen() 打开的进程. 如果失败,该函数返回 FALSE. 语法 pclose(pipe) 参数 描述 pipe 必需.规定由 popen() 打开的进 ...

  5. 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.

    考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...

  6. webapp项目新建java class、webapp目录树结构

      上一篇中我们介绍了IDEA.maven新建webapp项目的两种方式,分别是:在命令行中用模板创建.直接在IDEA中选择骨架创建. 但都存在一个问题:目录树不完整.有些人会不知道接下来该如何创建j ...

  7. 关于c/c++指针,指针的指针

    伪军迷祝:建军节快乐! 当调用一个函数时,实际上入参使用的都是副本(除非是引用),指针也不例外.举个例子如: void func(int a, int * p); 当调用func时无论是a还是p其实传 ...

  8. java 遍历数组常见的3种方式

    1.for循环,最常见 2.利用foreach 3.利用jdk自带的方法  --> java.util.Arrays.toString()

  9. CSS部分样式知识

    css文件 /* 注释内容 */ /* 选择器,其中body就是一个选择器,表示选中个body这个标签 声明块:为选择器设置样式 { 样式名: 样式值; } */ body{ background-c ...

  10. 用Python绘制一套“会跳舞”的动态图形给你看看

    在读技术博客的过程中,我们会发现那些能够把知识.成果讲透的博主很多都会做动态图表.他们的图是怎么做的?难度大吗?这篇文章就介绍了 Python 中一种简单的动态图表制作方法. 看这优美的舞姿 很多人学 ...