練習:
"fdgavcbsacdfs" 獲取該字符串中,每一個字母出現的次數。
要求打印結果是:a(2)b(1)...;
思路:
* 對於結果的分析發現,字母和次數之間存在着映射的關系。而且這種關系很多。
* 很多就需要存儲,能存儲映射關系的容器有數組和Map集合。
* 關系一方式有序編號嗎?沒有!
* 那就是使用Map集合。 又發現可以保證唯一性的一方具備着順序如 a b c ...
* 所以可以使用TreeMap集合。
* 這個集合最終應該存儲的是字母和次數的對應關系。
*
* 1、因為操作的是字符串中的字母,所以先將字符串變成字符數組。
* 2、遍歷字符數組,用每一個字母作為鍵去查Map集合這個表。
* 如果該字母鍵不存在,就將該字母作為鍵 1作為值存儲到map集合中。
* 如果該字母鍵存在,就將該字母鍵對應值取出並+1,在將該字母和+1后的值存儲到map集合中,
* 鍵相同值會覆蓋。這樣就記錄住了該字母的次數.
* 3、遍歷結束,map集合就記錄所有字母的出現的次數。
package com.steven.demo; import java.util.*; public class MapTest { /** * @param args */ public static void main(String[] args){ String str = "fdg+avAdc bs5dDa9c-dfs"; String s = getCharCount(str); System.out.println(s); } /** * @param str * @return */ public static String getCharCount(String str){ // 將字符串轉換成字符數組 char[] chs = str.toCharArray(); // 定義map集合 Map<Character,Integer> map = new TreeMap<Character, Integer>(); for(int i = 0; i < chs.length; i++){ if(!(chs[i] >= 'a' && chs[i] <= 'z' || chs[i] >= 'A' && chs[i] <= 'Z')){ continue; } // 將數組中的字母作為鍵去查map表 Integer value = map.get(chs[i]); // 定義次數,用存放字母出現次數 int count = 1; // 存在就將次數+1 if(value != null){ count = value + 1; } map.put(chs[i], count); } return mapToString(map); } /** * @param map * @return */ private static String mapToString(Map<Character, Integer> map) { StringBuilder stringBuilder = new StringBuilder(); // 返回map里面的全部key的集合,然后去除重復的元素 Iterator<Character> it = map.keySet().iterator(); // it.hasNext()判斷集合中是否存在值;如果存在就it.next() while(it.hasNext()){ // 就是取得當前集合的元素 然后把指針往后度移一位指向下一個元素 Character key = it.next(); // 返回map里面指定鍵映射的值 Integer value = map.get(key); // 打印結果 stringBuilder.append(key+":"+value+"\n"); } return stringBuilder.toString(); } }