軟工網絡16作業2
阿新 • • 發佈:2018-09-17
字符串 統計單詞 table 碼雲 輸出 sort 說明 相關 單詞
1、碼雲項目地址:
https://gitee.com/eshy/PersonalProject-Java
2、個人的PSP表格:
PSP2.1 | 個人開發流程 | 預估耗費時間(分鐘) | 實際耗費時間 |
---|---|---|---|
Planning | 計劃 | 35 | 40 |
· Estimate | 明確需求和其他相關因素,估計每個階段的時間成本 | 30 | 45 |
Development | 開發 | 500 | 530 |
· Analysis | 需求分析 (包括學習新技術) | 120 | 145 |
· Design Spec | 生成設計文檔 | 30 | 50 |
· Design Review | 設計復審 | 100 | 120 |
· Coding Standard | 代碼規範 | 30 | 45 |
· Design | 具體設計 | 30 | 30 |
· Coding | 具體編碼 | 100 | 130 |
· Code Review | 代碼復審 | 30 | 40 |
· Test | 測試(自我測試,修改代碼,提交修改) | 30 | 50 |
Reporting | 報告 | 70 | 80 |
· | 測試報告 | 30 | 45 |
· | 計算工作量 | 30 | 40 |
· | 並提出過程改進計劃 | 30 | 40 |
3、解題思路描述:
首先我考慮的是從文件取出來字符串,再將字符串的單詞、分隔符一個個取出來,然後用hashmap儲存單詞(分隔符),其中key值為單詞(分隔符),value值為其數量。
統計單詞的數量只需要將hashmap中的單詞部分取出來,然後將value部分相加。統計分隔符同理。
然後行數的統計是通過取文件中的單詞時利用的是readLine()
函數,所以沒使用一次就讓行計數器加一就行了。
因為剛接觸了不久的java,所以相較c++會更熟悉一些,但是還是有很多的函數不熟悉,就比如說文件流我不是很會用,就是通過百度,然後慢慢看它的定義再使用,我大部分的時間都花在了這個上面。
4、設計實現過程:
- LineCounter()函數:實現有效行統計。
- CharacterCounter()函數:實現字符統計。
- WordCounter()函數:實現單詞統計。
- WordSort()函數:將出現頻率最高的十個單詞放在一個鏈表中。
- sortMap()函數:對單詞按詞頻排序,詞頻相同按字典方式排序。
5、代碼說明:
1、LineCounter()函數
public static int LineCounter(String path) throws Exception {//有效行計算
InputStreamReader is1 = new InputStreamReader(new FileInputStream(path));
BufferedReader br1 = new BufferedReader(is1);
String str = br1.readLine();
int lines = 0;
while(str!=null) {
if(!str.equals(""))
lines++;
str = br1.readLine();
}
br1.close();
is1.close();
return lines;
}
有效行統計函數,我使用的方法就是將文件打開一次,然後逐行讀取,只要不為空,就讓有效行加1。
2、WordCounter()函數
public static int WordCounter(Map<String,Integer> map) throws Exception{//單詞數計算
int words = 0;
Set<String> set = map.keySet();
for(String s:set) {
if(s.charAt(0)>=‘a‘&&s.charAt(0)<=‘z‘)
words += map.get(s);
}
return words;
}
單詞統計函數,將map中的單詞取出來,然後讓他們的value值相加。
3、WordSort()函數
public static String WordSort(Map<String,Integer> map) throws Exception{
List<Map.Entry<String, Integer>> l = sortMap(map);
String[] st = new String[l.size()];
String file = new String();
int i = 0;
for(Map.Entry<String, Integer> k : l) {
if(k.getKey().charAt(0)>=‘a‘&&k.getKey().charAt(0)<=‘z‘) {
st[i] = "<" + k.getKey() + ">:" + k.getValue();
i++;
if(i>=10)
break;
}
}
for(i = 0;i < 10;i++) {
file = file+"\r\n"+st[i];
}
return file;
}
詞頻前十單詞統計,將map用sortMap函數進行排序,然後直接取出前十個單詞。
4、sortMap()函數
public static List sortMap(Map map) { // 對單詞詞頻的Map進行排序
List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
if (o1.getValue() == o2.getValue()) {
return o1.getKey().compareTo(o2.getKey());//詞頻相同時,按字典排列
}
return o2.getValue() - o1.getValue(); //降序排列
}
});
return list;
}
單詞詞頻排序函數。
6、單元測試
1、輸入文件和輸出文件展示:
2、Junit測試:
7、個人總結
我個人的習慣就是看到題目之後就直接順著打代碼,走一步是一步,導致了我走了很多彎路,經常推翻之前寫的一些函數,費了不少的時間,打代碼的過程很痛苦。所以我就試著先理出流程,然後再順著流程編寫代碼,雖然不是很熟練,但是相比較沒有理流程輕松了不少。我覺得接下來的編程任務整理流程這一步真的很重要,我會慢慢適應這個方式。
軟工網絡16作業2