1. 程式人生 > >軟工網絡16作業2

軟工網絡16作業2

字符串 統計單詞 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