對每個功能 (或/和子功能)的預計花費時間
功能 | 預計時間(min) | 實際時間(min) |
檔案存放、分詞、詞頻統計 | 60 | 82 |
詞頻排序 | 20 | 27 |
讀取目錄下書目 | 15 | 26 |
主函式設計 | 50 | 74 |
詞頻統計psp
日期 | 型別 | 任務 | 開始時間 | 結束時間 | 被打斷時間 | 計劃(min) | 實際(min) |
2016.10.07 | 需求分析 | 看spec,分析每個功能的需求 | 14:59 | 15:38 | 3 | 30 | 36 |
2016.10.07 | 編碼學習 | 設計檔案存放、分詞、詞頻統計,閱讀同學的程式碼 | 15:44 | 17:11 | 5 | 60 | 82 |
2016.10.07 | 編碼學習 | 詞頻排序、讀取目錄下書目、主函式設計 | 19:00 | 21:26 | 19 | 85 | 127 |
2016.10.08 | 編碼學習 | 學習重定向 | 15.01 | 15:39 | 2 | 30 | 36 |
2016.10.08 | 程式碼複審 | 寫部落格、除錯執行結果 | 15:45 | 17:12 | 6 | 30 | 81 |
2016.10.08 | 程式碼複審 | 寫部落格、除錯執行結果 | 17:53 | 18:26 | 3 | 30 | |
2016.10.09 | 總結psp | 總結各項時間,總結心得,釋出部落格 | 9:48 | 10:57 | 7 | 30 | 62 |
對比分析
拖拉很久的作業,利用這個假期終於能勉強補上點了,之前動手蒐集了一些資料進行學習,一直摸不清頭緒,這次看了同學的程式碼才弄清楚大概。對於預期和實際上的差距,主要有下面幾個原因:
看過資料後感覺上程式的流程是這樣,但實際動手做起來的時候會遇到很多細節上的問題。例如在DOS下執行程式時會出現“wordcounta.java:13: 錯誤: 找不到符號”這樣的錯誤提示。
在編寫程式時遇到型別、宣告類的格式不對,呼叫方法的規則不正確等等錯誤。在更改這些錯誤上花費了不少的時間。
學習程式碼時遇到了很多問題。例如分詞時split()方法中要用的引數的使用,BufferedReader、FileReader的用法,Map對儲存到ArrayList的方法等等。
需求分析
作業中需要完成四個功能。
第一,使用者輸入的小檔案進行詞頻統計。輸出統計的單詞總數,每個單詞的詞頻。可以利用這個方法,來滿足其他需求下的這個功能。
第二,使用者可以輸入檔案的名字來對此檔案進行詞頻統計。輸出統計的單詞總數,每個單詞的詞頻。
第三,使用者輸入檔案所在目錄。在該目錄下顯示所有.txt檔案,隨後對每個檔案進行詞頻統計。輸出結果中應顯示單詞總數,以及不重複的單詞數。由於在書目數量過多的情況下,顯示每個單詞的詞頻結果篇幅非常長,使用者使用起來非常不方便。於是要在結果中只顯示每個文件詞頻排名前十的結果。
第四,使用者輸入重定向指令,在重定向的目錄下對檔案進行詞頻統計。輸出統計的單詞總數,每個單詞的詞頻。
功能實現
建立wordcount類,該類實現了詞頻統計的基本功能。包含以下三個方法:
public Map<String, Integer> map(File dir)
public ArrayList<Map.Entry<String,Integer>> SortMap(Map<String,Integer> oldmap)
public File[] Outputlist(Scanner sc)
public Map<String, Integer> map(File dir):對輸入的File檔案讀取,對檔案每一行分詞去空格及標點後存入ls佇列,對ls中的單詞進行統計,存入“Map對”wc中。Map<String,Integer>中的String表示單詞變數,Integer表示出現次數變數。
1 public Map<String, Integer> map(File dir) throws IOException{ 2 BufferedReader reader = new BufferedReader(new FileReader(dir)); 3 List<String> ls = new ArrayList<String>(); 4 String readLine = null; //定義readLine初始值 5 Map<String,Integer> wc = new TreeMap<String,Integer>(); 6 while((readLine = reader.readLine()) != null){ 7 String[] wordsArr1 = readLine.split("[^a-zA-Z]"); //將每個單詞分割 8 for (String word : wordsArr1) { 9 if(word.length() != 0){ //去除長度為0的單詞 10 ls.add(word); //將每個單詞存入列表 11 } 12 } 13 } 14 reader.close(); //關閉流 15 16 //單詞的詞頻統計 17 for (String li : ls) { 18 if(wc.get(li) != null){ //get(li)表示獲得當前的單詞數 19 wc.put(li,wc.get(li) + 1); 20 }else{ 21 wc.put(li,1); 22 } 23 24 } 25 return wc; 26 }
public ArrayList<Map.Entry<String,Integer>> SortMap(Map<String,Integer> oldmap):對“Map對”進行排序,按照Map中Integer的降序排序。
1 public ArrayList<Map.Entry<String,Integer>> SortMap(Map<String,Integer> oldmap){ 2 3 ArrayList<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(oldmap.entrySet()); 4 5 Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){ //降序 6 @Override 7 public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 8 return o2.getValue().compareTo(o1.getValue()); 9 } 10 }); 11 12 return list; 13 }
public File[] Outputlist(Scanner sc):對輸入的地址查詢txt文件,把文件存入File陣列中,輸出陣列,並返回陣列,以便對陣列下的每個文件進行詞頻統計。
1 public File[] Outputlist(Scanner sc) throws IOException{ 2 File file=new File(sc.nextLine()); 3 File[] tempList = file.listFiles(); 4 System.out.println("該目錄下的書目有:"); 5 for (int i = 0; i < tempList.length; i++) { 6 if (tempList[i].isFile()) { 7 System.out.println(tempList[i].getName()); 8 } 9 } 10 return tempList; 11 }
建立wordcounta,wordcountb,wordcountc,wordcountd四個類,對應著分別實現了需求的四個功能
wordcounta:
1 public class wordcounta { 2 public static void main(String[] args) throws IOException { 3 // TODO Auto-generated method stub 4 @SuppressWarnings("resource") 5 Scanner input = new Scanner(System.in); 6 wordcount yl = new wordcount(); 7 File file = new File(input.nextLine()); 8 Map<String, Integer> wc = yl.map(file); 9 ArrayList<Map.Entry<String,Integer>> list = yl.SortMap(wc); 10 int j = 0;//出事單詞總數 11 12 for(int k = 0;k < list.size();k++){ 13 j+=list.get(k).getValue(); 14 } 15 System.out.println("單詞的總數是:"+j); 16 for(int k = 0;k < list.size();k++){ 17 System.out.println(list.get(k).getKey()+ ": " +list.get(k).getValue()); 18 } 19 20 } 21 22 }
執行結果如下
wordcountb:
1 public class wordcountb { 2 3 public static void main(String[] args) throws IOException { 4 // TODO Auto-generated method stub 5 wordcount yl = new wordcount(); 6 Scanner inputxt = new Scanner(System.in); 7 File[] tempList = yl.Outputlist(inputxt); 8 for(int i = 0;i<tempList.length;i++){ //對目錄下的每個檔案進行統計 9 System.out.println(tempList[i].getName()); 10 Map<String, Integer> wc = yl.map(tempList[i]);//統計詞頻 11 ArrayList<Map.Entry<String,Integer>> list = yl.SortMap(wc);//詞頻排序 12 int j = 0; 13 for(int k = 0;k < list.size();k++) 14 { 15 j+=list.get(k).getValue(); 16 } 17 18 System.out.println("單詞的總數是"+j+" "+"不重複的單詞的個數"+list.size()); 19 if(list.size()>=10){ 20 for(int m = 0; m<10; m++){ 21 System.out.println(list.get(m).getKey()+ ": " +list.get(m).getValue()); 22 } 23 }else{ 24 for(int m = 0; m<list.size(); m++){ 25 System.out.println(list.get(m).getKey()+ ": " +list.get(m).getValue()); 26 } 27 System.out.println("該文件下不重複的單詞數不足十個"); 28 } 29 } 30 31 } 32 33 }
執行結果如下
wordcountc:
1 public class wordcountc { 2 3 public static void main(String[] args) throws IOException { 4 // TODO Auto-generated method stub 5 @SuppressWarnings("resource") 6 Scanner input = new Scanner(System.in); 7 String path = "D:\\小說\\"; 8 path += input.next(); 9 File file = new File(path+".txt"); 10 wordcount yl = new wordcount(); 11 Map<String, Integer> wc = yl.map(file); 12 ArrayList<Map.Entry<String,Integer>> list = yl.SortMap(wc); 13 int j = 0; 14 15 for(int k = 0;k < list.size();k++){ 16 j+=list.get(k).getValue(); 17 } 18 System.out.println("單詞的總數是:"+j); 19 for(int k = 0;k < list.size();k++){ 20 System.out.println(list.get(k).getKey()+ ": " +list.get(k).getValue()); 21 } 22 } 23 24 }
結果如下
wordcountd:
1 public class wordcountd { 2 3 public static void main(String[] args) throws IOException { 4 // TODO Auto-generated method stub 5 if (args.length == 0) { 6 Scanner in = new Scanner(System.in); 7 FileWriter out = new FileWriter("D:\\小說\\new.txt"); 8 while (in.hasNext()) { 9 out.write(in.nextLine()+"\r\n"); 10 } 11 out.close(); 12 in.close(); 13 } 14 File file = new File("D:\\小說\\new.txt"); 15 wordcount yl = new wordcount(); 16 Map<String, Integer> wc = yl.map(file); 17 ArrayList<Map.Entry<String,Integer>> list = yl.SortMap(wc); 18 19 int j = 0; 20 for(int k = 0;k < list.size();k++){ 21 j+=list.get(k).getValue(); 22 } 23 System.out.println("單詞的總數是:"+j); 24 for(int k = 0;k < list.size();k++){ 25 System.out.println(list.get(k).getKey()+ ": " +list.get(k).getValue()); 26 } 27 28 } 29 30 }
結果如下
HTTP:https://git.coding.net/YangXiaomoo/wordCountNO.1.git
SSH:git@git.coding.net:YangXiaomoo/wordCountNO.1.git
GIT:git://git.coding.net/YangXiaomoo/wordCountNO.1.git