第1次做業

要求0:做業要求地址【https://edu.cnblogs.com/campus/nenu/2016CS/homework/2110】

要求1:git倉庫地址【https://git.coding.net/yangmx2016011904/wf.git】

要求2:

PSP

任務內容

計劃時間(min)

完成時間(min)

Planning

計劃

30

60

 Estimate

 估計這個任務須要多少時間,並規劃大體工做步驟

30

60

Development

開發

630

910

Analysis

需求分析

40

60

Design Spec

生成文檔

20

30

 Design Review

設計複審

0

0

Coding Standard

代碼規範

20

40

Design

具體設計

60

120

Coding

具體編碼

420

540

Code Review

代碼複審

30

40

Test

測試

30

80

Reporting

報告

160

400

Test Report

測試報告

120

120

Size Measurement

計算工做量

20

30

Postmortem & Process Improvement Plan

過後總結, 並提出過程改進計劃

30

50

 

功能模塊

具體階段

預計時間(min)

實際時間(min)

  功能1

具體設計

具體編碼

測試完善

20

120

10

30

150

20

  功能2

具體設計

具體編碼

測試完善

20

150

10

40

150

25

  功能3

具體設計

具體編碼

測試完善

20

150

10

 

50

240

35

 

分析預估耗時和實際耗時的差距緣由:

       在整個項目的完成過程當中,我在具體編碼的這個方面花費的時間最多,我認爲主要有兩方面緣由:

       1.在計劃和需求分析,將有些問題想的過於簡單,在編程中不斷有新的問題產生,一個一個問題解決起來花費了一些超過預期的時間

       2.我對於編寫程序還不是很熟悉,因此忽然要開始上手具體編寫程序時就有一些懵了。因爲不是很熟悉,因此須要經過大量的查詢才能完成,但在查閱資料後在具體使用的時候仍是會出現這樣那樣的錯誤,這就大大拖慢了個人速度。通過這一次的我的項目,讓我認識到了我在實踐方面的不足,也激勵我在從此的學習中多動手,多實踐。

  項目實現的過程要比我想象中艱難,花費的時間也是遠遠超過個人預期。但也讓我從中收穫到不少,不斷髮現問題,分析問題,解決問題的過程也讓我對java語言有了更好的應用和理解。

要求3:

解題思路描述:    

       在看到統計文本文件(文件名後綴爲txt)中的單詞出現次數這個題目時,我一頭霧水,感受文本很長,統計要花費不少時間,因而我便開始在網上查閱有關統計詞彙的介紹,看了不少的博客、代碼,慢慢學習到了解決這個問題的思路,我以爲看到一道題以後的思惟方式很重要,有了思路以後才能慢慢解決接下來遇到的困難。經過學習參考網上一些相似問題的解決方法,我肯定了這道題的解題思路:就是不管多長的文章,都把它當作一句話,是個字符串,這個字符串中可能不只有英文單詞,還有一些標點符號,而這些空格、非字母正好是分割函數中的分割標準,這樣一來,在將這個長長的字符串進行分割後,剩餘的就是一個又一個須要計數統計的單詞,從而實現功能1。功能2主要是獲取某文件夾下的全部文件名,將文件名按字典序排序後返回指定文件。功能3則是對單詞出現的頻率進行排序,再按要求輸出出現次數最多的前N個單詞。

 

 簡述代碼並展現部分代碼片斷:

  我一共使用了四個類, 其中wfone、wftwo、wfthree分別對應功能一、二、3,並用類wf做爲測試類。在實現功能1時,單詞不區分大小寫,因此將其所有轉換爲小寫,使用了word = word.toLowerCase(),而後空格和非字母字符進行分割並存入數組,利用循環,使用isLegal()函數判斷是否爲合法單詞,並利用map函數的特色,來統計單詞的數量;在實現功能2時,首先在文件夾中讀取全部文件並參考功能1完成的;功能3則是經過增長比較器來實現的。感受本身學會的東西太少,因此不少都須要找資料看博客,但在這個解決問題的過程當中本身也學會了不少知識點,是有很大收穫的。在其中很大的收穫就是關於map函數的一些理解,map這個集合函數的使用,利用它的一些特性,健值不重複,能夠統計有多少不重複的單詞;將它的兩個屬性一個設置爲字符串類型,來記錄單詞,另外一個設計成整型,來記錄其個數。在向其中添加值時,利用myMap.containsKey(word[i])語句進行判斷,若是map中已有,則其數量值加1,若匹配不上,則將數量值記爲1。

接下來是一些代碼展現:

String str=characters.toString().toLowerCase();//將字符所有轉化爲小寫
            String[] word = str.split("[^a-zA-Z0-9]");//按空格和非字母進行分割
            int num =0;
            Map<String,Integer> myMap = new TreeMap<String,Integer>();//分割後存入數組
            //遍歷數組將其存入Map<String,Integer>中
            String regex="^[a-zA-Z][a-zA-Z0-9]*$";
            Pattern p =  Pattern.compile(regex);
            for(int i=0;i<word.length;i++) {    
                Matcher m =p.matcher(word[i]);
                if(m.matches()) {
                    if(myMap.containsKey(word[i])) {
                        num = myMap.get(word[i]);
                        myMap.put(word[i], num+1);
                    }
                    else {
                        myMap.put(word[i], 1);
                    }
                }
            }//判斷是否爲合法單詞 將合法單詞存入Map

  

List<Map.Entry<String, Integer>> list =new ArrayList<Map.Entry<String,Integer>>(myMap.entrySet());//Map轉換成list進行排序
            System.out.println("total"+" "+list.size()+"\n");
            for(int i=0;i<word.length;i++) {
                if(myMap.containsKey(word[i])) {
                    System.out.println(word[i]+" "+myMap.get(word[i]));
                    myMap.remove(word[i]);
                }//在Map集合中不該該利用get()方法來判斷是否存在某個鍵,而應該利用containsKey()方法來判斷
            }
            bufferedReader.close();

  

public String readDir(String filepath){
        File file = new File(filepath);
        String[] filelist = file.list();
        String[] characterlist = new String [filelist.length];
        for(int i=0;i<filelist.length;i++) {
            File readfile = new File(filepath+"\\"+filelist[i]);
            characterlist[i]=readfile.getName();
        }
        List<String> list = (List<String>)Arrays.asList(characterlist);
        Collections.sort(list);
        String[] paths = list.toArray(new String[0]);
            
        return paths[0];
    }//    使用readDir()函數讀取某文件夾下的全部文件

  

Collections.sort(list,new Comparator<Map.Entry<String, Integer>>(){
                public int compare(Entry<String,Integer> e1,Entry<String,Integer> e2) {
                    return e2.getValue().compareTo(e1.getValue());
                }
            });    //使用比較器進行排序

  

運行截圖:

 

我的感想:

在完成項目的過程當中,從最初的找不到方向到開始整理思路,解決遇到的一個又一個問題,我感受作什麼事都是要一步一步來的,這樣我想到了《構建之法》中第三章中,經過你們小時候常常玩的魔方引出技能的反面是解決問題,經過不斷地練習,把那些低層次的問題都解決了,變成不用通過大腦的自動操做,而後纔有時間和腦力來解決較高層次的問題。學習也是個按部就班的過程。

相關文章
相關標籤/搜索