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。