博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二周作业WordCount
阅读量:6828 次
发布时间:2019-06-26

本文共 6683 字,大约阅读时间需要 22 分钟。

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
fileContent(String filepath) 输入文件路径,并且返回这个路径下的每一行的内容,将每一行的内容放进一个string类型的动态数组
private static String[] cutToWord(String filePath)将文件中的每一行都加到一行中去,然后在行与行之间用空格隔开,最后将这一行字符串根据空格,"\t","\n"分开成一个字符串数组, 就是单词的集合
private static Set
banWord(String banlistFile)将所有的停用表中的内容放到一个set中去,既保证了不重复,又可以方便查询
private static int countWord(String str, Set
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. 

2. 

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

4. 

5.

6.

7.少部分方法参考:,并在参考后重写

转载于:https://www.cnblogs.com/lee17015/p/8611868.html

你可能感兴趣的文章
MongoDB 计划缓存的影响
查看>>
让linux服务器支持https(安全http协议)
查看>>
Django 笔记 模型数据的读取
查看>>
02-Windows Server 2012 新特性 ---- 管理中心
查看>>
PowerShell 远程连接指定 TrustedHost
查看>>
SQL Server 2014 内存优化表(1)实现内存优化表
查看>>
PowerShell Script Analyzer, Script browser 和 Pester
查看>>
Exchange 日常管理之一:用户邮箱完全访问权限
查看>>
kickstart+pxe 实现无人值守自动安装
查看>>
Exchange server 2013(十四)WSUS部署及组策略设置(2)
查看>>
SCCM2012系列之一,SCCM2012之初步印象
查看>>
JavaScript(React Native、Node.js等)移动、服务端通吃的全栈语言
查看>>
你了解这么多万兆以太网规范吗?
查看>>
Java向前引用容易出错的地方
查看>>
一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(1)...
查看>>
部署无需边缘提供外部访问的Lync Server前端
查看>>
最常用的四种数据分析方法
查看>>
c++学习笔记:类的若干基础问题
查看>>
ubuntu更改sso文件策略
查看>>
业务开发测试HBase之旅三:通过Java Api与HBase交互
查看>>