嘗試按照《構建之法》第2章中2.3所述PSP流程,使用JAVA編程語言,獨立完成一個英文文本詞頻統計的軟件開發。軟件基本功能要求以下:
- 程序可讀入任意英文文本文件,該文件中英文詞數大於等於1個。
- 程序須要很壯健,能讀取容納英文原版《哈利波特》10萬詞以上的文章。
- 指定單詞詞頻統計功能:用戶可輸入從該文本中想要查找詞頻的一個或任意多個英文單詞,運行程序的統計功能可顯示對應單詞在文本中出現的次數和柱狀圖。
- 高頻詞統計功能:用戶從鍵盤輸入高頻詞輸出的個數k,運行程序統計功能,可按文本中詞頻數降序顯示前k個單詞的詞頻及單詞。
- 統計該文本全部單詞數量及詞頻數,並能將單詞及詞頻數按字典順序輸出到文件result.txt。
- 讀取文件text.txt,能容納10萬單詞以上。
- 統計詞頻,能夠分解輸入字符串並統計輸入一個或多個單詞的詞頻。
- 統計高頻詞,用戶輸入高頻詞個數n,程序返回n個高頻詞以及每一個單詞的詞頻。
- 將text.txt文本中的單詞及其詞頻按照字典順序輸出到文件result.txt文件中。
項目主要包含兩個類,一個是主函數Main,一個是統計單詞的類SortResult。
- 主函數Main中實現圖形用戶界面,實現各個功能。輸入框3個,分別是原文本文件的文件名(採用相對路徑),想要查找的一個或多個單詞,想要查找的N高頻詞及其詞頻數。兩個按鈕,分別是「肯定」和「取消」。因爲兩個查找在同一個面板,防止出現衝突,若兩個輸入框均有輸入,則實現第一個輸入框的功能。點擊肯定後,直接將字典順序輸出到result.txt文本中,而且實現相應功能。
- SortResult中將文本中的每一個單詞按照字典順序將單詞及詞頻數輸出到result.txt文本文件中。
讀入text.txt文件,輸入要查找的一個或多個詞語,以空格爲分割符,返回各個單詞的詞頻及柱狀圖:
輸入想要查找的高頻單詞個數n,輸出前n個高頻詞及其頻數:
若同時輸入了查找單詞和查找高頻單詞個數,只執行查找單詞功能:
result.txt
int i; String print = "";//記錄輸入單詞及詞頻 String print2 = "\n";//記錄柱狀圖 for(i=0; i<input.length; i++) { for(Entry<String, Integer> entry : wordsStatistics.entrySet()) { if(input[i].equals(entry.getKey())) { map.put(entry.getKey(), entry.getValue()); print2+=entry.getKey()+":\n"; for(int j=0;j<entry.getValue()/100;j++) print2+="*";//柱狀圖以「*」顯示 print2+="\n"; print += entry.getKey() + ":" + entry.getValue()+" "; break; } } } JOptionPane.showConfirmDialog(null, print+print2,"結果",JOptionPane.DEFAULT_OPTION);
if(admin.isEmpty() && !num.isEmpty()) //若輸入單詞欄爲空且輸入高頻詞個數不爲空 { int n=Integer.parseInt(num);//將讀到的字符串轉化爲整型 String print = ""; ArrayList<Map.Entry<String,Integer>> resultlist = new ArrayList<Map.Entry<String,Integer>>(wordsStatistics.entrySet());//結果存入 resultlist Collections.sort(resultlist,new Comparator<Map.Entry<String,Integer>>(){ @Override public int compare(Entry<String, Integer> w1, Entry<String, Integer> w2) { return w2.getValue() - w1.getValue(); //以降序的形式存入 } }); for(int i = 0; i<n; i++){ print += resultlist.get(i).getKey()+ ": " +resultlist.get(i).getValue()+" "; } JOptionPane.showConfirmDialog(null, print,"結果",JOptionPane.DEFAULT_OPTION); }
- 本次項目爲單人項目,經過實踐,大體瞭解了軟件項目我的開發流程。從需求分析到設計實現再到測試運行,這次項目實驗讓我體驗了每個步驟的具體實現。
- 學會了在Github上發佈軟件項目的操做方法。
- 項目完成後還有許多地方不足,好比柱狀圖沒有用圖形的樣式表現出來。
- 本次項目完成時的模塊劃分能力有所欠缺,只有兩個模塊,功能實現Main和字典輸出到文本,多數功能都在Main中直接編碼調用。
實際完成時間(min) | 計劃完成時間(min) | 任務內容 | PSP2.1 |
---|---|---|---|
28 | 20 | 計劃 | Planning |
28 | 20 | 估計這個任務須要多少時間,並規劃大體工做步驟 | Estimate |
1020 | 674 | 開發 | Development |
30 | 20 | 需求分析(包括學習新技術) | Analysis |
35 | 20 | 設計 | Design |
22 | 10 | 設計複審 | Design Review |
5 | 4 | 代碼規範 | Coding Standard |
58 | 60 | 具體設計 | Design |
720 | 480 | 具體編碼 | Coding |
120 | 60 | 代碼複審 | Code Review |
30 | 20 | 測試 | test |
65 | 60 | 報告 | Reporting |
30 | 30 | 測試報告 | Test Report |
20 | 20 | 計算工做量 | Size Measurement |
15 | 10 | 過後總結,病提出過程改進計劃 | Postmortem & Process Improvement Plan |
經過總結,發現本次項目的計劃時間與實際完成時間出入比較大,尤爲在具體編碼方面,體現了個人動手編寫代碼能力不足,須要增強,也是由於設計的時候沒有細化,不夠完善,致使編寫代碼時不順利。在從此的學習中,但願能夠增強個人項目具體設計能力及編程能力。java