package cn.itcast.p1.map.test; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; public class TestMap { /** * 練習: * "fdgavcbsacdfs+++AA&&BBB" 獲取該字符串中,每個字母出現的次數。 * 要求打印結果是:a(2)b(1)...; * 思路: * 對於結果的分析發現,字母和次數之間存在着映射的關係。並且這種關係不少。 * 不少就須要存儲,能存儲映射關係的容器有數組和Map集合。 * 關係一方式有序編號嗎?沒有! * 那就是使用Map集合。 又發現能夠保證惟一性的一方具有着順序如 a b c ... * 因此能夠使用TreeMap集合。 * * 1.由於操做的是字符串中的字母,因此先把字符串變成字符數組 * 2.遍歷字符數組,若是該字母不存在,就將該字母的鍵對應的值爲1存儲到map中 * 若是,該字母存在,就將該字母的鍵對應的值+1存儲到map中,鍵相同就會覆蓋, * 這樣就記錄了每一個字母在字符串中出現的次數 * 3.遍歷結束map記錄全部字母出現的次數 */ public static void main(String[] args) { String str = "asbbbadccfdssf+df-dfucccier%AA+HfffHDAS"; String s = getTreeCount(str); System.out.println(s); } public static String getTreeCount(String str) { //把字符串變成字符數組 char[] ch = str.toCharArray(); //定義一個TreeMap用來存儲字母和次數的映射關係 Map<Character, Integer>map = new TreeMap<Character, Integer>(); for (int i = 0; i < ch.length; i++) { if(!(ch[i] >= 'a' && ch[i] <= 'z' || ch[i] >= 'A' && ch[i]<='Z')){ continue; } //把字符數組中的字母做爲鍵查map表 Integer value = map.get(ch[i]); int count = 1; if(value != null){ count = value + 1; } map.put(ch[i], count); /*if(value == null){ map.put(ch[i], 1); }else{ map.put(ch[i], value+1); }*/ } return mapToString(map); } private static String mapToString(Map<Character, Integer> map) { StringBuilder sb = new StringBuilder(); /*Iterator<Map.Entry<Character, Integer>>it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<Character, Integer> mapEntry = it.next(); Character key = mapEntry.getKey(); Integer value = mapEntry.getValue(); sb.append(key+"("+value+")"); }*/ Iterator<Character>it = map.keySet().iterator(); while (it.hasNext()) { Character key = it.next(); System.out.println(key); Integer value = map.get(key); sb.append(key+"("+value+")"); } return sb.toString(); } }