软件工程实践之词频统计
生活随笔
收集整理的這篇文章主要介紹了
软件工程实践之词频统计
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
GitHub倉庫地址:?https://github.com/softwarehsc/java1
PSP表格:
| 合計(jì) | ? | 540 | ? |
| · Test Repor | · 測(cè)試報(bào)告 | 60 | 40 |
| · Test | · 測(cè)試(自我測(cè)試,修改代碼,提交修改) | 60 | 240 |
| · Size Measurement | · 計(jì)算工作量 | 10 | 10 |
| · Postmortem & Process Improvement Plan | · 事后總結(jié), 并提出過程改進(jìn)計(jì)劃 | 10 | 10 |
| · Estimate | · 估計(jì)這個(gè)任務(wù)需要多少時(shí)間 | 20 | 60 |
| · Design Spec | · 生成設(shè)計(jì)文檔 | 30 | 30 |
| · Design Review | · 設(shè)計(jì)復(fù)審 | 30 | 10 |
| · Design | · 具體設(shè)計(jì) | 60 | 30 |
| · Coding Standard | · 代碼規(guī)范 (為目前的開發(fā)制定合適的規(guī)范) | 20 | 15 |
| · Coding | · 具體編碼 | 120 | 380 |
| · Code Review | · 代碼復(fù)審 | 60 | 30 |
| · Analysis | · 需求分析 (包括學(xué)習(xí)新技術(shù)) | 60 | 60 |
| Reporting | 報(bào)告 | 80 | 60 |
| Planning | 計(jì)劃 | 60 | 60 |
| Development | 開發(fā) | 480 | 795 |
需求分析
統(tǒng)計(jì)文件的字符數(shù):
- 只需要統(tǒng)計(jì)Ascii碼,漢字不需考慮
- 空格,水平制表符,換行符,均算字符
統(tǒng)計(jì)文件的單詞總數(shù),單詞:至少以4個(gè)英文字母開頭,跟上字母數(shù)字符號(hào),單詞以分隔符分割,不區(qū)分大小寫。
統(tǒng)計(jì)文件的有效行數(shù):任何包含非空白字符的行,都需要統(tǒng)計(jì)。- 英文字母: A-Z,a-z
- 字母數(shù)字符號(hào):A-Z, a-z,0-9
- 分割符:空格,非字母數(shù)字符號(hào)
- 例:file123是一個(gè)單詞, 123file不是一個(gè)單詞。file,File和FILE是同一個(gè)單詞
按照字典序輸出到文件result.txt:例如,windows95,windows98和windows2000同時(shí)出現(xiàn)時(shí),則先輸出windows2000
- 輸出的單詞統(tǒng)一為小寫格式
輸出的格式為
實(shí)現(xiàn)過程
在eclipse建立文件main.java包含文件的讀入和主方法,調(diào)用lib.java中Print類的求characters、words、lines等的方法實(shí)現(xiàn)需求。
在WordCount類中首先通利用BufferedReader類通過從字符輸入流中讀取文本。將所有字母單詞轉(zhuǎn)換為小寫形式,再次讀取文檔,通過正則表達(dá)式
過濾掉標(biāo)點(diǎn)符號(hào)分離出單詞存儲(chǔ)在lists列表中(List<String> lists = new ArrayList<String>();?)。最后通過wordsCount存儲(chǔ)單詞計(jì)數(shù)信息(Map<String, Integer> wordsCount = new TreeMap<String,Integer>();)
代碼說明
主方法類用于讀取文本文件統(tǒng)計(jì)字符個(gè)數(shù) 并調(diào)用Store類中的函數(shù)將words、lines等參數(shù)的值存入result.txt文件中: package main.java;import java.io.BufferedReader; import java.io.CharArrayWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Scanner; import java.util.TreeMap; import lib.java.Store; public class WordCount { public static void main(String[] args) throws Exception { try {//File file = new File(args[0]);//String pathname = file.getPath();Scanner scanner=new Scanner(System.in);String pathname=scanner.nextLine();Reader myReader = new FileReader(pathname);Reader myBufferedReader = new BufferedReader(myReader); //對(duì)文本處理CharArrayWriter tempStream = new CharArrayWriter();int i = -1;do {if(i!=-1)tempStream.write(i);i = myBufferedReader.read();if(i >= 65 && i <= 90){i += 32;}}while(i != -1);myBufferedReader.close();Writer myWriter = new FileWriter(pathname);tempStream.writeTo(myWriter);tempStream.flush();tempStream.close();myWriter.close();BufferedReader br = new BufferedReader(new FileReader(pathname)); int characterscount=0; int wordline = 0;int wordcount = 0;List<String> lists = new ArrayList<String>(); //存儲(chǔ)過濾后單詞的列表 String readLine = null;while((readLine = br.readLine()) != null){ wordline++;String[] wordsArr1 = readLine.split("[^a-zA-Z0-9]"); //過濾出只含有字母的單詞characterscount+=readLine.length();for (String word : wordsArr1) { if(word.length() != 0){ //去除長度為0的行while(!(word.charAt(0)>=97&&word.charAt(0)<=122)){word = word.substring(1, word.length());}if(word.length()>=4) wordcount++;lists.add(word); } } } br.close(); Map<String, Integer> wordsCount = new TreeMap<String,Integer>(); //單詞的詞頻統(tǒng)計(jì) for (String li : lists) { if(wordsCount.get(li) != null){ wordsCount.put(li,wordsCount.get(li) + 1); }else{ wordsCount.put(li,1); } } Store st= new Store();st.store_result(wordsCount, wordline, wordcount, characterscount); }catch (Exception e) {e.printStackTrace();} } }
用Store類將輸出存入result.txt文件中:
1 package lib.java; 2 import java.io.BufferedWriter; 3 import java.io.File; 4 import java.io.FileWriter; 5 import java.util.ArrayList; 6 import java.util.Collections; 7 import java.util.Comparator; 8 import java.util.Map; 9 import java.util.Map.Entry; 10 11 public class Store { 12 13 public static void store_result(Map<String,Integer> oldmap,int wordline,int wordcount,int characterscount){ 14 ArrayList<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(oldmap.entrySet()); 15 Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){ 16 public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 17 return o2.getValue() - o1.getValue(); //降序 18 } 19 }); 20 try { 21 //System.out.println(wordcount); 22 File file = new File("src//result.txt"); 23 BufferedWriter bi = new BufferedWriter(new FileWriter(file)); 24 bi.write("characters: "+(characterscount+wordline)+"\r\n"); 25 bi.write("words: "+wordcount+"\r\n"); 26 bi.write("lines: "+wordline+"\r\n"); 27 int k=0; 28 for(int i = 0; i<list.size(); i++){ 29 if(k>=10)break; 30 if(list.get(i).getKey().length()>3) 31 { 32 bi.write("<"+list.get(i).getKey()+">"+ ": " +list.get(i).getValue()+"\r\n"); 33 k++; 34 } 35 36 } 37 bi.close(); 38 }catch (Exception e) { 39 e.printStackTrace(); 40 } 41 42 } 43 }?
用EclEmma進(jìn)行覆蓋率測(cè)試:
?
?
?命令行測(cè)試樣例:
?
?
?
??總結(jié):
一開始沒有認(rèn)真地理解題目意思,更沒有系統(tǒng)地分析解題過程。在沒有較為完善的計(jì)劃之前就直接寫程序?qū)е伦吡撕芏嗟膹澛贰R院笤僮鲆粋€(gè)項(xiàng)目之前,哪怕這個(gè)項(xiàng)目結(jié)構(gòu)不是很復(fù)雜,也應(yīng)該寫好項(xiàng)目文檔,這樣在開發(fā)的過程中便能清楚地知道將要完成的模塊和更好的完善代碼。在測(cè)試過程中也能根據(jù)文檔快速地進(jìn)行代碼優(yōu)化。
?
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/heshoucheng/p/9610814.html
總結(jié)
以上是生活随笔為你收集整理的软件工程实践之词频统计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。