需求分析
1.程序可讀入任意英文文本文件,該文件中英文詞數大於等於1個。
2.程序須要很壯健,能讀取容納英文原版《哈利波特》10萬詞以上的文章。
基本功能
1.指定單詞詞頻統計功能:用戶可輸入從該文本中想要查找詞頻的一個或任意多個英文單詞,運行程序的統計功能可顯示對應單詞在文本中出現的次數和柱狀圖。
2.高頻詞統計功能:用戶從鍵盤輸入高頻詞輸出的個數k,運行程序統計功能,可按文本中詞頻數降序顯示前k個單詞的詞頻及單詞。
3.統計該文本全部單詞數量及詞頻數,並能將單詞及詞頻數按字典順序輸出到文件result.txt。
環境需求
1.測試機環境:Windows環境
2.JDK版本:jdk8u161
3.JRE版本:jre8u161
功能設計
1.新建文本文件data.txt
2.統計各個單詞出現的次數
3.若是次數相同,安裝單詞的字典順序排序
4.輸出單詞個數
5.輸入要查詢的單詞,顯示它出現的次數
6.輸出結果並將其存儲到result.txt文件中
設計實現
經過Map集合,以鍵值對的方式去存儲單詞和出現的次數,定義一個文件字節讀取流,去讀取磁盤中的文件,建立了一個BufferReader的緩衝流,將字符流對象傳進去,提升讀取的效率,建立一個split數組,用來分割字符串,經過調用map的key值獲取value,進行單詞統計,用TreeMap實現Comparator接口,對Map集合進行排序
測試運行
- 程序的運行截圖以下圖:
- 單詞查找:
- 單詞個數統計:
- 詞頻統計:
- 詞頻輸出結果:
代碼片斷
Map<String, Integer> wordsCount = new TreeMap<String,Integer>(); //存儲單詞計數信息,key值爲單詞,value爲單詞數
//單詞的詞頻統計
for (String li : lists) {
if(wordsCount.get(li) != null){
wordsCount.put(li,wordsCount.get(li) + 1);
}else{
wordsCount.put(li,1);
ArrayList<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(oldmap.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
return o2.getValue() - o1.getValue(); //降序
}
});
try{
FileWriter fr=new FileWriter("D:\\results.txt");
BufferedWriter txt=new BufferedWriter(fr);
for (Map.Entry<String,Integer> entry: list) {
txt.write(entry.getKey()+":"+entry.getValue());
txt.newLine();
}
txt.flush();
txt.close();
System.out.println("詞頻統計結果已輸出到result.txt文件!");
}
catch(IOException e) {
e.printStackTrace();
展現PSP
任務內容 |
計劃共完成須要的時間(min) |
實際完成須要的時間(min) |
計劃 |
10 |
9 |
估計這個任務須要多少時間,並規劃大體工做步驟 |
15 |
20 |
開發 |
200 |
230 |
需求分析 (包括學習新技術) |
10 |
10 |
生成設計文檔 |
10 |
15 |
設計複審 (和同事審覈設計文檔) |
10 |
12 |
代碼規範 (爲目前的開發制定合適的規範) |
10 |
9 |
具體設計 |
40 |
45 |
具體編碼 |
120 |
130 |
代碼複審 |
15 |
12 |
測試(自我測試,修改代碼,提交修改) |
30 |
40 |
報告 |
15 |
15 |
測試報告 |
5 |
6 |
計算工做量 |
5 |
3 |
過後總結 ,並提出過程改進計劃 |
6 |
4 |
具體設計和具體編碼環節耗時最多,測試(自我測試,修改代碼,提交修改)環節估計和實踐相差巨大。具體緣由可能要歸結於因爲Java編程功底很弱,對於Java語法結構、類的定義、函數的構造等知識方面都嚴重匱乏致使在代碼編碼上浪費了不少時間。
本次做業項目github地址git