1.要求:實現一個控制台程序,給定一段英文字符串,統計其中各個英文單詞的出現頻率。
2.性能分析:
- 對C++代碼運行VS的性能分析工具,找出性能問題並進行優化。
- 對Java程序運行性能分析工具 NetBeans IDE 6.0,找出性能問題並進行優化。
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.Map.Entry; import java.util.Scanner; public class 修改 { public static void main(String arg[]) { Map<String, Integer> map= //用於統計各單詞的個數 new HashMap<String, Integer>(); String sentence="Word is case insensitive, i.e. “file”, “FILE”" + "and “File” are considered the same word."; //大寫字母轉化為小寫 sentence=sentence.toLowerCase(); //將字符串分解成一個個的標記 StringTokenizer token=new StringTokenizer(sentence); while (token.hasMoreTokens()) { //單詞用這些分隔符 分開 String word=token.nextToken(", “”?.!:\"\"''\n"); int count; //HashMap不允許重復的key,用這個特性,去統計單詞的個數 if (word.length()>=4) { if (map.containsKey(word)) { count=map.get(word); //如果已有這個單詞則設置它的數量加1 map.put(word, count + 1); } else { //如果沒有這個單詞則新填入數量為1 map.put(word, 1); } } } //調用函數並輸出 sort(map); } public static void sort(Map<String, Integer> map) { List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); for ( int i = 0; i < infoIds.size(); i++) { Entry<String, Integer> id = infoIds.get(i); System.out.println(id.getKey() + ":" + id.getValue()); } } }
下面是測試結果:
file:3 word:2 case:1 same:1 considered:1 insensitive:1
當輸入的英文字符串為 Beware,beware!he'll cheat'ithout scruple,who can without fear.輸出為:
scruple:1 cheat:1 beware:2 without:1 ithout:1 fear:1
總結:主要利用哈希函數的特性來統計單詞的個數,
toLowerCase來確保不分大小寫 ,
token.nextToken()來分離出英語單詞。
整體來說程序還是易於操作的。
github鏈接:https://github.com/Yizhongmeng/Mengzhongyi
性能分析工具下載顯示電腦未安裝jdk。。。。。