軟件工程第二次作業(王偉東)
一周的時光轉瞬即逝,第二周的作業也悄悄地開始了。楊老師的一言一行都深深地刻在我的心裏,“不遲到”是做人做事的根本,努力則是成就人生的基石。正如《道德經》中所言“天地不仁,視萬物為芻狗”,上天對待世間萬物是公平的,從來都是不偏不倚,只有勤奮好學的人才會得到垂青和獎賞。
㈠詞頻統計的四個功能
①首先控制臺輸入內容到文件中,再對文件進行詞頻統計;
②命令行輸入英文作品名,然後統計作品詞頻;
③命令行輸入英文作品文件的目錄名,再批量統計;
④從控制臺讀入英文單篇作品,再統計詞頻。
功能①
功能一是先輸入“type test.txt”命令,然後在控制臺輸入簡短的英文句子,再輸入“wf test.txt”命令展現控制臺輸入句子的詞頻。除了統計詞頻,該功能還統計了句子中不重復的單詞數以及對單詞頻率進行了降序排序。本功能的重點怎麽樣從控制臺讀取字符串並保存到文本文件中,這裏使用了BufferedWriter並且實現了在文本的追加功能。
控制臺字符串保存到文本文件功能
1 //構造一個BufferedReader對象 2 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 3 bw = new BufferedWriter(new FileWriter("test.txt",true)); 4 //接收控制臺一行的輸入 5 String str = br.readLine(); 6 //如果換行後輸入exit,則退出控制臺輸入操作。 7 while(!str.equals("exit")){ 8 //將控制臺輸入的字符串寫入文件 9 bw.write(str); 10 //換行 11 bw.newLine(); 12 //刷新緩沖區 13 bw.flush(); 14 //繼續接收控制臺的輸入 15 str = br.readLine();16 }
指令判斷功能
1 /*指令判斷功能(只有輸入正確的指令才能統計詞頻,指令錯誤會給出提示)*/ 2 System.out.print(">"); 3 Scanner sc = new Scanner(System.in); 4 //讀取指令 5 String scStr = sc.nextLine(); 6 String sp2 = "\\s+"; 7 //對指令進行字符串分割 8 String str2[] = scStr.split(sp2); 9 //判斷“wf”指令 10 if(!(str2[0].equals("wf"))) { 11 System.out.println("請確認您的命令!!!"); 12 System.exit(0); 13 } 14 //判斷“-s”指令 15 if(!(str2[1].equals("-s"))) { 16 System.out.println("請確認您的命令!!!"); 17 System.exit(0); 18 } 19 //判斷“test.txt”指令 20 if(!(str2[2].equals("test.txt"))) { 21 System.out.println("請確認您的命令!!!"); 22 System.exit(0); 23 }
運行截圖
功能②
功能二是通過控制臺輸入“wf gone_with_the_wind”命令來統計這部英文作品的詞頻。同樣,此功能也統計了不重復的單詞數以及對單詞頻率進行了降序排序。功能2和功能1有相似之處,都要讀取文件和統計詞頻。這裏介紹一個四個功能都要用到的方法,也是十分重要的方法,這個方法就是字符串分割方法。字符串分割方法要利用好正則表達式的用法。此外,保存單詞和詞頻也是非常重要的方法,這裏使用Hashmap來保存單詞和詞頻。
字符串分割功能
1 //將大寫字符轉換成小寫字符(方便統計) 2 line.toLowerCase(); 3 //設置正則匹配字符 4 String mt ="\\w+"; 5 //將每行讀取的文本進行分割並存放在字符數組 6 String str[] = line.split("[^a-zA-Z]+");
保存單詞和詞頻功能
1 for(String s: str) { 2 //判斷s是否是字母開頭 3 4 if(s.matches(mt)){ 5 if(!map.containsKey(s)){ 6 //如果集合中不存在該單詞,則將該單詞加入該集合中並且計數設為1。 7 map.put(s,1); 8 //每當有新單詞加入,計數加1。 9 count++; 10 }else{ 11 //如果集合中存在該單詞,則將該單詞加入該集合中並且計數加1。 12 map.put(s,map.get(s)+1); 13 } 14 } 15 }
運行截圖
功能③
功能三是通過命令行輸入存儲有英文作品文件的目錄名的命令“dir folder”來展示目錄下的所有英文作品,然後使用“wf folder”命令來分別統計所有英文作品的詞頻。這個功能介紹又一個重要的方法,那就是詞頻降序排序功能。降序排序其實是對Hashmap進行按值排序,然後輸出前十個詞頻最高的單詞。
詞頻降序排序功能
1 //將map.entrySet()轉換成list 2 List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 3 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 4 //降序排序 5 @Override 6 public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 7 //return o1.getValue().compareTo(o2.getValue()); 8 return o2.getValue().compareTo(o1.getValue()); 9 } 10 });
運行截圖
功能④
功能四是基於前三個功能來實現的。在這裏解決一個每個程序都存在的問題,那就是如何對齊輸出的單詞和詞頻。使用制表符能很好地解決不對齊的問題。
解決單詞和詞頻不能對齊問題
1 for (Map.Entry<String, Integer> mapping : list) { 2 System.out.println(mapping.getKey() + "\t" + mapping.getValue()); 3 }
運行截圖
㈡PSP
任務 | 預計花費時間(分鐘) | 實際花費時間(分鐘) | 差距原因 |
功能一 | 80 | 103 | 開學的第一個程序,忘記了很多方法的使用。第一個功能是後面功能的基石。 |
功能二 | 40 | 65 | 用了很多時間查找比較好的排序算法,寫字符串到文件的方法也不是很熟練。 |
功能三 | 40 | 58 | 由於要幫同學講需求,花費了6分鐘左右。 |
功能四 | 30 | 20 | 由於有了前三個功能的基礎,所以第四個功能用時較少。 |
合計 | 190 | 246 |
㈢代碼及版本控制
1、控制基本流程(四個功能上傳了四個文件)
2、coding.net地址:https://git.coding.net/wangwd/SecondAssignment.git
軟件工程第二次作業(王偉東)