GIT地址 | GITHUB克隆地址 |
---|---|
结对伙伴 | 余睿哲 |
伙伴学号 | 201831061417 |
伙伴博客地址 | 地址 |
共五大类,其中计算方法类和命令行翻译类两个类须要设计对应的接口。html
详细内容见下面思惟导图(若是图片看不清能够适当放大网页观看)
java
CountMethodImpl类 为Main类提供各类算法git
TranslateCommandImpl类 则翻译Main类传过去的命令行指令,并返回须要的参数github
WriteFile类 主要用于文件读写算法
Test类 用于测试各类类中的方法可否正确实现编程
Main类 中执行主函数,集成全部功能。ide
注:有效行数与看到的行数不一样的缘由:文档窗口的大小不一样,会致使显示的行数不一样,若是文档窗口足够长,则该文章(测试文章)可显示为一行
函数
Interface Design工具
为两个比较重要,且内部函数较多的类设计了接口
性能
Loose Coupling
设计了五大类,将各个部分分开,想要加减功能能够在对应的类中进行更新,对总体影响较小
Information Hiding
使用一些常量将ASCII码、条件语句以及循环的参数保存起来,即隐藏了数据也提升了代码的可读性。
IDEA编译器能够下载审查插件
插件扫描结果,即还存在的问题:
改正后:
还存在必定的问题是由于:
一、有一个类为最先写的测试类,里面有较多直接使用的数字(之后会多加注意)。
二、有变量定义为numberM和numberN,是符合小写驼峰命名法的,是插件扫描判断错误。
接口实现的函数中,大多数都须要用到循环,循环的时间复杂度不算多,但也不算少。因此在循环中减小没必要要的循环,不如在须要跳出循环时跳出循环,减小循环次数等等,便可减小必定的时间消耗,从而提升性能。
安装方法
主函数由于集成了全部工具类的方法,因此消耗最大
主函数代码以下
public static void main(String[] args) { //输入命令行 Scanner scanner = new Scanner(System.in); String cmd = scanner.nextLine(); //建立须要的对象 TranslateCommandImpl translate = new TranslateCommandImpl(); CountMethodImpl method = new CountMethodImpl(); WriteFile writeFile = new WriteFile(); //获得须要的参数 String inFile = translate.returnInFile(cmd); String outFile = translate.returnOutFile(cmd); int numberM = translate.returnNumberM(cmd); int numberN = translate.returnNumberN(cmd); //可否读到文件,不能则中止 try { InputStream in = new FileInputStream(inFile); }catch (IOException e) { System.out.println("文件位置有误!"); return; } //用于保存各类数据 int characters, words, lines; //词频Map中的长度 int length; //判断有无-i, -o指令 String noFile = "null"; if(noFile.equals(inFile) || noFile.equals(outFile)) { System.out.println("输入或者输出不能为空!"); return; } //用于保存单词集 List<String> strings; //定长单词集 List<String> lengthWords; characters = method.countCharacterNumber(inFile); strings = method.countWordNumber(inFile); words = strings.size(); lines = method.countLine(inFile); lengthWords = method.statisticsWord(strings, numberM); //获得词频的Map List<Map.Entry<String, Integer>> frequency = method.countWordsFrequency(strings); //保存定长词频 List<Map.Entry<String, Integer>> neededFrequency = new ArrayList<>(); //获得其长度,方便遍历 int maxLength = 10; length = frequency.size(); //若是长度大于10,则把长度变成10 if(length > maxLength) { length = 10; } //打印结果 System.out.println("字符总数是:"+characters); System.out.println("有效单词数是:"+words); System.out.println("有效行数是:"+lines); System.out.println("单词的出现频率从高到低依次是:"); for(int i=0; i<length; i++) { System.out.println(frequency.get(i)); } if(numberM > 0) { System.out.println("定长为 "+numberM+" 的单词是:"+lengthWords); } //若是参数n大于Map中的大小,则打印有效个。 if(numberN > length) { numberN = length; } if(numberN > 0) { System.out.println("出现评率最高的前"+numberN+"个单词依次是:"); for(int i=0; i<numberN; i++) { System.out.println(frequency.get(i)); neededFrequency.add(frequency.get(i)); } } //写入文件 writeFile.writeFile(outFile, characters, words, lines, lengthWords, neededFrequency); }
函数构造思路:获得数据后,打印文章行数
数据构造思路:文章中有空行,看程序可否正确判断
函数构造思路:获得数据后,统计有效单词数后打印
数据构造思路:文章中有部分非有效单词,看程序可否成功判断并存入单词集合中。
函数构造思路:给定一条命令行指令,看可否正确地得到参数
数据构造思路:给定各类形式的命令行进行测试,看可否正确得到参数;以及命令行有问题时可否正确报错。
注:异常处理都在主函数中直接进行测试
此次很幸运可以找到也一样是写JAVA的同窗余睿哲。分工明确,由于我在一开始就对这个程序的编写有比较明确的思路,全部完成了大部分代码的编写;相应的他完成了不少代码的审计工做。结对编程让我感到一个复杂程序的编写,由于两我的的合做与努力变得简单了。结对期间没有发生任何矛盾,每一个人都把本身的作的那部分任务作到了最好。代码的编写期间也有过阻碍,经过两我的的共同思考解决了问题。让我真切的感觉到1+1>2。