github地址:

https://github.com/DouglasLee001/softTest

一.PSP表格 

 

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

 10分钟  20分钟

· Estimate

· 估计这个任务需要多少时间

 2天  1天

Development

开发

 1天  1天

· Analysis

· 需求分析 (包括学习新技术)

 0.5天  1天

· Design Spec

· 生成设计文档

 -  -

· Design Review

· 设计复审 (和同事审核设计文档)

 -  -

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 20分钟  20分钟

· Design

· 具体设计

 2小时  3小时

· Coding

· 具体编码

 0.5天  10小时

· Code Review

· 代码复审

 0.5天  0.5天

· Test

· 测试(自我测试,修改代码,提交修改)

 0.5天  0.5天

Reporting

报告

 30分钟  30分钟

· Test Report

· 测试报告

 30分钟  1小时

· Size Measurement

· 计算工作量

 2小时  1小时

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 1小时  0.5小时
 

合计

 6天  4天半

二.解题思路

1.首先这个作业是需要在控制台进行操作的,所以在编写程序时应该从main函数的args[]中传入参数

2.其次这个作业的基本要求是要统计出字符数,行数,单词数以及要能指定输出文件夹,

  (1)因此对于字符数可以选择直接将每一行的内容存在一个string里面,用length()函数读出,并且需要注意的是,因为换行是算字符的,因此需要加上行数-1;

  (2)对于行数可以选择将内容读进一个string的动态数组后统计动态数组的长度

  (3)对于单词数目可以选择将每一行的内容存在一个string中,然后在每一行之间加上“ ”,最后用java自带的split函数将这个长字符串切分成短的string,每个string就是一个单词

3.作业的拓展功能是要实现停用词表和递归查找以及复杂的数据结构

  (1)递归使用一下深搜就可以实现

  (2)停用词表的实现可以使用一下set功能,查找一下对应的单词是否在set中

  (3)注释行和空行,代码行的解决详见代码注释

4.至于最后打包成.exe文件可以参考:https://jingyan.baidu.com/article/2a138328f3e2b0074a134ffe.html

三.程序设计实现过程

private static void error(String err)报错函数
private static ArrayList<String> fileContent(String filepath) 输入文件路径,并且返回这个路径下的每一行的内容,将每一行的内容放进一个string类型的动态数组
private static String[] cutToWord(String filePath)将文件中的每一行都加到一行中去,然后在行与行之间用空格隔开,最后将这一行字符串根据空格,"\t","\n"分开成一个字符串数组,
就是单词的集合
private static Set<String> banWord(String banlistFile)将所有的停用表中的内容放到一个set中去,既保证了不重复,又可以方便查询
private static int countWord(String str, Set<String> banWords)数单词的函数
private static int sumChar(String[] contents)数字符的函数
private static int[] lines(String[] contents)返回行数的函数
private static class Argstransit类:将命令行中输入的内容转换成对应类的参数
private static void confirm(String filepath)确定文件路径是否存在,如果不存在的话就创建一个加上去,用于创建输出文件的时候
private static void count(String filepath, Argstransit po, PrintWriter out)将信息放在Argstransit这个类中传递过来,再根据其上的内容信息来调用上面的各个函数
private static void findDownfiles(String dir,String filepath)递归寻找所有的文件
public static void main(String[] args) 主函数

四.代码说明

private static void findDownfiles(String dir,String filepath)
复制代码
     //递归寻找所有的文件,
    private static void findDownfiles(String dir,String filepath) {//作为深搜
        File fp=new File(dir);
        for(File f :fp.listFiles()){
            if(f.getName().matches(filepath)&&f.isFile()){//如果是一个文件,并且这个文件的名字和输入的名字相同,就插入但动态数组末尾
                fls.add(dir+f.getName());
            }
            else if(f.isDirectory())//如果是一个文件夹,那么就搜索下面的文件
                findDownfiles(dir+f.getName()+"/",filepath);
        }
    }

复制代码
private static int[] lines(String[] contents)
复制代码
private static class Argstransit {
        Boolean c = false;
        Boolean w = false;
        Boolean l = false;
        Boolean s = false;
        Boolean a = false;
        Boolean o = false;
        Boolean e = false;
        String filePath;
        String outPath;
        String banPath;
        //int filepathNum=0;
        Argstransit(String[] args) {
            for (int i = 0; i < args.length; i++) {
                if(args[i].charAt(0) == '-' && args[i].length() < 3) {
                    switch (args[i].charAt(1)) {
                        case 'w': this.w = true;break;// 如下来判定是否有输入对应的内容
                        case 'l': this.l = true;break;
                        case 's': this.s = true;break;
                        case 'a': this.a = true;break;
                        case 'c': this.c = true;break;
                        case 'o':
                            this.o = true;
                            i++;
                            if(i < args.length) {
                                this.outPath = args[i];//o之后要紧跟着输出表
                                //File fp=new File(this.outPath);
                            }
                            else {
                                error("未找到输出表");//如果“-o”之后就已经结束,那么就是没有输入输入表
                                this.o = false;
                            }
                            break;
                        case 'e':
                            this.e = true;
                            i++;
                            if(i < args.length) {
                                File fp=new File(args[i]);
                                if(!fp.exists())
                                    error("未找到停用词表");//如果后面的内容不是一个已经存在的文件,那么就报错
                                else
                                    this.banPath = args[i];//e之后要紧跟着停用表
                            }
                            else error("未找到停用词表");//如果-e之后后面没有内容了,就报错
                            break;
                        default: break;
                    }
                } else {
                    this.filePath = args[i];
                    System.out.print(filePath);
                }
            }
        }
    }
复制代码
 private static int[] lines(String[] contents)
复制代码
     //返回linecount{代码行,空行,注释}
    private static int[] lines(String[] contents) {
        int[] linecount = {0, 0, 0};
        for (String line : contents) {
            if(line.trim().length() <= 1) {//去掉了前后的空格,然后再统计总共有多少个字符,如果小于2就是空行
                linecount[1]++;
            } else {
                if(!line.trim().contains("//")) {
                    linecount[0]++;//如果没有"//"那一定是代码行
                } else if(line.replaceAll(" ", "").indexOf("//") > 1) {
                    linecount[0]++;//如果有"//",但是去掉了所有空格后发现"//"的位置在第三个或者之后,是代码行
                } else if(line.contains("//")) {
                    linecount[2]++;//否则是注释行,也就是"//"在第一个位置或者第二个位置
                }
            }
        }
        return linecount;
    }
复制代码

五.测试设计过程

对于java文件测试命令行设计:

复制代码
java WordCount -c case1.c -o output1://针对没有空格没有换行的情况做的只统计字符数的“冒烟测试”

java WordCount -c -l -w  case1.c -o output2:针对输入中没有换行没有空格的所有基础功能测试

java WordCount -c -l -w case2.c -o output3.txt://针对输入中含有空格的所有基础功能测试

java WordCount -c -l -w case3.c -o 3.c   -o output4.txt://针对输入中含有空格和换行的所有基础功能测试

java WordCount -a case4.c -o output5.txt://针对(代码行 / 空行 / 注释行)的测试

java WordCount -s -c  case5.c  -o output6.txt//:针对递归寻找文件“-s”的测试

java WordCount -s -c -a case5.c -o output7.txt://针对递归寻找文件s功能和其他扩展功能如a,以及基本功能如c的集成的测试

java WordCount -c -w -e stoplist.txt  case6.c -o output8.txt://针对停用词表的测试

java WordCount -c -w -l -s -a -e stoplist.txt case7.c -o output9.txt://针对所有的功能的测试

java WordCount -c -w://对于没有文件名的测试

java WordCount -c case10.c://对于文件名不存在的测试

java WordCount -c case1.c -e://-e之后没有停用词表

WordCount -c case1.c -e st.txt://停用词表不存在的情况

java WordCount -c case1.c -o://输出符号“-o”之后没有紧跟输出文件位置
复制代码

对应的测试结果在

github中BIN中的

output1.txt  output2.txt  output3.txt  output4.txt  output5.txt  output6.txt  output7.txt  output8.txt  output9.txt 

六.参考链接

1. http://www.cnblogs.com/winterfells/p/7965596.html

2. http://www.runoob.com/java/java-environment-setup.html

3.https://jingyan.baidu.com/article/2a138328f3e2b0074a134ffe.html

4. http://blog.csdn.net/alex__0805/article/details/50895222

5.https://bbs.csdn.net/topics/390567815

6.https://www.cnblogs.com/zhaoyan001/p/6077492.html

7.少部分方法参考:https://github.com/mxz96102/word_count,并在参考后重写