軟工網絡 16我的做業2html
PSP2.1 | 我的開發流程 | 預估耗費時間(分鐘) | 實際耗費時間(分鐘) |
---|---|---|---|
Planning | 計劃 | 30 | 55 |
Estimate | 明確需求和其餘相關因素,估計每一個階段的時間成本 | 1000 | 1650 |
Development | 開發 | 180 | 200 |
Analysis | 需求分析 (包括學習新技術) | 180 | 190 |
Design Spec | 生成設計文檔 | 40 | 40 |
Design Review | 設計複審 | 40 | 60 |
Coding Standard | 代碼規範 | 15 | 15 |
Design | 具體設計 | 30 | 30 |
Coding | 具體編碼 | 60 | 100 |
Code Review | 代碼複審 | 30 | 30 |
Test | 測試(自我測試,修改代碼,提交修改) | 40 | 60 |
Reporting | 報告 | 60 | 60 |
測試報告 | 30 | 30 | |
計算工做量 | 30 | 30 | |
過後總結,並提出過程改進計劃 | 20 | 20 |
代碼組織:將幾個功能封裝在幾個函數中,再進行調用。
一、統計字符數
將要統計的文件的路徑作爲參數傳入函數中,再按照解題思路中利用字符流逐個讀取字符進行判斷和統計。
設計函數num_of_char以下:git
private static int num_of_char(String filename2) { File file =new File(filename); InputStreamReader r=null;//輸入流讀取單個字符 int c_num=0;//字符計數器 try { r=new InputStreamReader(new FileInputStream(file)); int tempchar;//存放單個字符 try { while((tempchar=r.read()) !=-1) { if((tempchar >31&&tempchar<127)||tempchar==10||tempchar==9) { //讀取的字符不包括漢字,但有包括換行符(10)和空格符 c_num++; } } r.close();//關閉資源 } catch (IOException e) ; } } catch (FileNotFoundException e) { System.out.println("文件不存在"); } return c_num++; }
二、統計有效行數
統計文件的路徑做爲傳入參數,利用BufferedReader讀取一行文件內容,判斷是否爲空,不然將計數器加一。程序員
private static int num_of_line(String filename2) throws IOException { File file =new File(filename); int l_num=0;//行數計數器 BufferedReader r=null; r=new BufferedReader(new FileReader(file)); String s=null; while((s=r.readLine())!=null) {//讀到一行,計數器加1 l_num=l_num+1; } r.close(); return l_num; }
三、統計單詞數
利用List存放文本的全部有效單詞。統計文件的路徑做爲傳入參數,利用BufferedReader讀取一行文件內容,利用正則表達式"\\s*[^0-9a-zA-Z]+"
分割過濾除字母和數字之外的字符串。將全部字符串轉爲小寫。進一步判斷字符串是否含有數字(設計函數isNumberic(String str)),有數字,若知足以4個英文字母開頭,跟上字母數字符號的格式(利用正則表達式),就將其加入單詞表中;字符串中沒有數字,例如:I,am,you等單詞,也加入到單詞表中。最後返回單詞表的長度,即爲單詞總數。正則表達式
//統計單詞數 private static int num_of_word(String filename) throws IOException { int w_num=0; File file =new File(filename); BufferedReader rf=null; rf=new BufferedReader(new FileReader(file)); String s; while((s=rf.readLine())!=null) { String regex="\\s*[^0-9a-zA-Z]+";//正則表達式,過濾除字母和數字意外的特殊符號 String[] s2=s.split(regex);//分割字符串 for (String str : s2) { String string=str.toLowerCase();//將單詞轉爲小寫 if(isNumberic(string)) {//判斷字符串中有數字 if(string.length()>3) {//有數字,判斷單詞長度超過或等於4 if (string.matches("[a-zA-Z]{4,}[a-zA-Z0-9]*")) {//判斷單詞是否爲4個字母加上數字,知足條件添加進表 lists.add(string); } } } else//字符串中沒有數字 { lists.add(string); } } } rf.close(); w_num=lists.size(); return w_num; }
判斷字符串中是否有數字函數編程
public static boolean isNumberic(String str) { boolean re=false; for(int i=0;i<str.length();i++){ if(Character.isDigit(str.charAt(i))){ re = true; break; } } return re; }
四、統計詞頻並輸出頻數前10的單詞數組
將完成的單詞表list逐一取出單詞,存入集合wordMap中,其中集合的key值爲單詞,value值爲單詞出現的頻數。當集合中不存在這個單詞時,就將其add入集合中;若存在,就將該單詞的頻數即value加一。網絡
//利用Map集合統計詞頻 public static void word_fre(){ int value; for (String word : lists) { if(wordMap.containsKey(word)) { value=wordMap.get(word); value++; wordMap.put(word, value); } else { wordMap.put(word, 1); } } }
//將map集合進行排序並返回前10個單詞的字符串數組 public static String[] sortWord() { List<Map.Entry<String, Integer>> wordlist = new ArrayList<Map.Entry<String, Integer>>(wordMap.entrySet()); Collections.sort(wordlist, ((o1, o2) -> o2.getValue().compareTo(o1.getValue()))); //排序 String[] str=new String[10]; int i=0; for (Map.Entry<String, Integer> entry : wordlist) { //拼接字符串key+value if(i!=10) { str[i]="<"+entry.getKey()+">"+":"+entry.getValue(); i++; } else { break; } } return str; }
五、寫出文件
利用FileWrite進行寫出操做。函數
//path:寫出文件的路徑;content:寫出的內容 public static void writetofile(String path, String content) throws IOException { FileWriter fw = new FileWriter(new File(path)); fw.write(content); fw.write("\n"); fw.close(); }
對於各個功能模塊分別提供一些測試樣例進行測試。其中功能可基本實現。但寫出文件模塊沒法將結果完成寫出,每次都只能顯示一個。單元測試
測試樣例有:
學習
代碼覆蓋率:
利用JProfiler
答: