前段時間接觸的這個題目,大體理解了,還有些小地方仍待進一步品味,暫且記下。
import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /* * 查找字符串中出現頻率最高的字符 * * 主要思路:先將字符串存入set集合,以保證沒有重復字符 * 然后取出set集合中的每一個字符,並用String的indexOf()方法進行索引 * 若索引不為-1,則說明該字符存在,記錄其在字符串中的索引位置 * 並將記錄字符出現次數的變量++,再從當前索引位置+1處開始進行索引, * 直到索引值為-1,則退出循環,至此每個字符出現的頻率都已記錄 * 接下來采用map進行字符與字符所對應的頻率進行存儲 * 再將map的values形成一個ArrayList集合 * 將計算得到的最大頻率與map中的值進行比較 * 若相等,則其為最大頻率的字符 */ public class HighFrequencyWord { public static void findFrequencyWord(String str) { Collection<Integer> al=new ArrayList<Integer>(); Map<String,Integer> map=new HashMap<String,Integer>(); String tempStr = str;// 臨時存儲字符串 String[] stringArray = str.split("");// 把字符串切成一個個字符 // 無重復地存儲字符串中出現的字符 Set<String> set = new HashSet<String>(); int stringLength = stringArray.length; for (int i = 0; i < stringLength; i++) { set.add(stringArray[i]); } // 移掉set中的一個空字符 (哪一個?什么意思??) set.remove(""); System.out.println(set);// 這里輸出為 [ , a, b, c] int count = 0; boolean flag = true; for (String s : set) { while (flag) { if (tempStr.indexOf(s) != -1) {// 若索引存在 int index = tempStr.indexOf(s);// 記錄字符的當前位置 tempStr = tempStr.substring(index + 1);// 往后繼續查詢 count++; } else { flag = false;// 如果索引不存在,賦值false退出循環 } } flag = true;// 為了執行下一循環 map.put(s,count);// 記錄字符與其對應頻率,並存放在map中 // 初始化結果,為下次循環做准備 count = 0; tempStr = str; } // 將map的value轉為一個List al= map.values(); // 再轉為數組 Integer[] stringCount =al.toArray(new Integer[]{}); Arrays.sort(stringCount);// 按升序排序 int countLength=stringCount.length; int max=stringCount[countLength-1];// 得到數組最大值(從小到大排序后最后一個即為出現頻率最高的值) for(String s: set) { for(int i=0; i<countLength; i++){ // 若map值與最大值相同,則輸出 if (map.get(s) == max) { System.out.println(s + ":" + max);// Q: 這樣循環結果會輸出多次,如何只輸出一次?? } } } } public static void main(String[] args) { findFrequencyWord("abab bc"); } }
原文:http://www.2cto.com/kf/201205/133219.html,此處略有改動。