软工第二次作业,词频统计

Gayhub地址:https://github.com/TheHZDev/personal-project

1、PSP表格
PSP2.1"|"Personal Software Process Stages"|"预估耗时(分钟)"|"实际耗时(分钟)
Planning"|"计划
· Estimate"|"· 估计这个任务需要多少时间 "|"30"|"240
Development "|"开发
· Analysis "|"· 需求分析 (包括学习新技术) "|"20"|"30
· Design Spec"|" · 生成设计文档 "|"0"|"0
· Design Review"|"· 设计复审 "|"0"|"0
· Coding Standard "|"· 代码规范 (为目前的开发制定合适的规范) "|"0"|"0
· Design "|"· 具体设计 "|"20"|"5
· Coding "|"· 具体编码 "|"60"|"10
· Code Review "|"· 代码复审 "|"0"|"200
· Test "|"· 测试(自我测试,修改代码,提交修改) "|"10"|"360
Reporting"|"报告
· Test Repor"|"· 测试报告 "|"0"|"120
· Size Measurement "|"· 计算工作量 "|"60"|"60
· Postmortem & Process Improvement Plan "|"· 事后总结, 并提出过程改进计划 "|"0"|"0
"|"合计 "|"200"|"825

2、计算模块接口的设计与实现过程。
在读取字符上采取逐个字符读取的方法,有大写字母自动转换为小写字母,若有一个小写字母就开始统计单词数。在遇到空格和标点符号以后,认为单词结束并让统计单词数的变量自增,如果是长度至少为4的单词,则放入TreeMap类中存放并统计出现次数。在统计有效行时,在程序中维持一个Flag,只有在有有效的单词或数字存在时,该Flag才为True,开始 时和检测到换行符后均重置为false——只有当该Flag为True,该行才被认为是有效行而计入统计当中。
由于程序的实现基于逐字符读取,且读取完字符后立刻关闭文件。因此程序中只有一个类,所有的行统计、字符统计、单词统计均被存放在该类的私有变量当中,需要调用相应的外部接口才可获得具体数据。在读取完文件后,由于对TreeMap尝试改造其对Value排序失败,采用逐个比较的方法筛选出前10名最多出现的单词。随后输出。

3、计算模块部分单元测试展示。


            while (true) {
                ch1 = InputFile.read();
                if (ch1 > 122) continue;//不是ASCII则继续读取
                CharCount++;
                if(ch1 <= 90 && ch1 >= 65) ch1+=32;//自动转换为小写字母
                if((ch1 >= '1' && ch1 <= '9') || (ch1 >= 'a' && ch1 <='z')) LineChar = 1;
                if (ch1 == -1) break;//字符流错误,退出
                Temp = (char) ch1;
                if(LineChar == 1 && Temp == '\n')//只统计有效行,有效行至少应有一个数字或字母
                {
                    LineChar = 0;
                    LengthCount = 0;
                    LineCount++;
                    continue;
                }
                if(LengthCount > 0)
                {
                    if(Temp == '.' || Temp == ',' || Temp == ';' || Temp == ' ' || Temp == '!'  || Temp == '\"') {
                        WordCount++;//判断为标点符号时单词数+1
                        if(LengthCount > 3)//达到要求时加入Map中
                        {
                            if(MainMap.get(ToRead) == null)
                                MainMap.put(ToRead,1);
                            else
                                MainMap.put(ToRead,MainMap.get(ToRead)+1);
                        }
                        LengthCount = 0;
                        continue;
                    }
                    LengthCount++;
                    ToRead = ToRead.concat(String.valueOf(Temp));
                    continue;
                }
                if(Temp >= 97 && Temp <= 122 && LengthCount == 0){//以小写字母作为单词开头的标志
                    LengthCount++;
                    ToRead = String.valueOf(Temp);
                }
            }

这是统计字符数据的核心部分,所有的统计基础都在这里完成。对于测试样本,我基本上直接找新华社的那些英文新闻,本地保存一下就可以当测试样本用了。

4、计算模块部分异常处理说明。
由于Java提供了非常完备的异常捕获机制,因此基本上不用操心太多的事情。对于几个可能会遇见的我也做了处理。
问:读取的不是ASCII码怎么办?
答:ASCII码的统计范围是0到127,超过就认为是其他字符,跳过。
问:怎么确保读取的时候不会发生跳出?
答:读取的函数在读到结尾时会返回-1,根据这个特点就可以及时终止读入行为。
问:文件找不到怎么办?
答:会有出错提示。
问:发生了I/O错误该怎么办?
答:程序会立刻终止,也请向我反馈这个问题以便更好地解决。
问:我只给了少于10个单词或数字,能否正确统计?
答:在统计时迭代器会自动处理的,少于10个也一样能输出。

posted @ 2018-09-12 22:48  HZDev  阅读(148)  评论(0编辑  收藏  举报