這個做業屬於哪一個課程 | https://edu.cnblogs.com/campus/zswxy/computer-science-class3-2018/homework/11879 |
---|---|
這個做業要求在哪裏 | https://edu.cnblogs.com/campus/zswxy/computer-science-class3-2018/homework/11879 |
這個做業的目標 | 1.學習使用git和github 2.編寫WordCount程序 3.總結 |
學號 | 20188483 |
其餘參考文獻 | 《構建之法》,CSDN |
gitee地址:
https://gitee.com/flz13873652172/project-javajava
PSP表格git
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 30 | 43 |
• Estimate | • 估計這個任務須要多少時間 | 30 | 43 |
Development | 開發 | 780 | 1030 |
• Analysis | • 需求分析 (包括學習新技術) | 120 | 260 |
• Design Spec | • 生成設計文檔 | 30 | 60 |
• Design Review | • 設計複審 | 10 | 15 |
• Coding Standard | • 代碼規範 (爲目前的開發制定合適的規範) | 30 | 25 |
• Design | • 具體設計 | 90 | 110 |
• Coding | • 具體編碼 | 360 | 400 |
• Code Review | • 代碼複審 | 20 | 10 |
• Test | • 測試(自我測試,修改代碼,提交修改 | 120 | 150 |
Reporting | 報告 | 135 | 145 |
• Test Repor | • 測試報告 | 90 | 100 |
• Size Measurement | • 計算工做量 | 15 | 10 |
• Postmortem & Process Improvement Plan | • 過後總結, 並提出過程改進計劃 | 30 | 35 |
合計 | 1030 | 1217 |
解題思路描述 1、需求分解 首先我根據做業要求,把需求分解成如下小部分 讀取文件內數據 統計文件字符數 統計文件單詞總數 統計文件有效行數 統計出現頻率最高的10個單詞 以UTF-8格式輸出到指定文件
代碼規範制定連接 https://gitee.com/flz13873652172/project-java/blob/master/codestyle.md
設計與實現過程 1、類構建組織 爲了實現功能獨立,我將需求二、三、四、5封裝在WordCountMethods類,進行字符數量、行數、單詞數、詞頻的統計;將需求一、6封裝進WordCountIO類,:進行文件內容的讀取,以及處理結果的寫入;最後設計一個WordCount類調用以上兩個類的方法去實現WordCount功能。
2、主要方法設計 2.1 WordCountIO/讀取文件轉化爲string形式 FileInputStream fileinputstream=new FileInputStream(filePath); InputStreamReader inputstreamreader=new InputStreamReader(fileinputstream); br = new BufferedReader(inputstreamreader); int c; while ((c = br.read()) != -1) { strBud.append((char) c); } br.close(); return strBud.toString(); 2.1.1 解釋思路 最開始我是想到用BufferedReader中包裝InputStreamReader類,可是一開始程序用的是BufferedReader類的readline(),後期單元測試的時候發現問題,readline當遇到換行符('\n'),回車符('\r')時會終止讀取表示該行文字讀取完畢且返回該行文字(不包含換行符和回車符),就會致使沒法統計換行符、回車符,因而後來改用read(),讀取1個或多個字節,返回一個字符,當讀取到文件末尾時,返回-1。
2.2 WordCountMethods/統計文件有效行數 InputStream inpStr = new FileInputStream(filePath); BufferedReader br = new BufferedReader(new InputStreamReader(inpStr)); //空白行的正則匹配器 Pattern blankLinePattern = Pattern.compile(BLANK_LINE_REGEX); String line = null; while ((line = br.readLine()) != null) { if (blankLinePattern.matcher(line).find()) { //是空白行就計數 blankLine++; } allLine++; } //有效行是總行數減去空白行數 validLine = allLine-blankLine; return validLine; 2.2.1 解釋思路 個人想法是統計出全部行數減去空白行就是有效行數.可是如何判斷哪一行是空白行是個關鍵問題。 我通過上網搜索查閱資料,發現能夠使用正則表達式"\s+" 正則表達式中\s+匹配任何空白字符,包括空格、製表符、換頁符等等, 等價於[ \f\n\r\t\v] \f -> 匹配一個換頁 \n -> 匹配一個換行符 \r -> 匹配一個回車符 \t -> 匹配一個製表符 \v -> 匹配一個垂直製表符
2.3 WordCountMethods/統計合法單詞數 int words = 0; //先所有轉小寫 String lowerStr = str.toLowerCase(); //匹配非單詞非數字的字符 Pattern pat = Pattern.compile(UN_ALPHABET_NUM_REGEX); Matcher mat = pat.matcher(lowerStr); //轉換爲空格 lowerStr = mat.replaceAll(" "); //按規定的分隔符拆分 String[] word = lowerStr.split("\\s+"); for (int i = 0; i < word.length; i++) { String tw = word[i]; //判斷是否是要求的單詞 if (tw.matches(FIRST_FOUR_APLH_REGEX)) { words++; if (!map.containsKey(tw)) { map.put(tw, 1); } else { int num = map.get(tw); map.put(tw, num + 1); } } }
2.4 WordCountMethods/統計出現頻率最高的單詞 Collections.sort(list,new Comparator<Map.Entry<String, Integer>>(){ //Treemap只要比較出現次數,不用再比較字典序 public int compare(Map.Entry<String, Integer> word1, Map.Entry<String, Integer> word2) { return word2.getValue() - word1.getValue(); }
心路歷程與收穫github
感受太難了,第一關git的使用就不會,後來本身在b站看視頻講解會了(地址:https://www.bilibili.com/video/BV1FE411P7B3?p=9&spm_id_from=pageDriver) 也很是感謝個人室友的幫助,打代碼的過程當中出現了不少問題,仍是本身專業知識不夠豐富,還得多多學習; 但願老師下次別弄這麼難的了,孩子內心苦呀