天天看點

JAVA 擷取字元串中每一個字母出現的次數 TreeMap 解

初學map集合,ACM 題 用java集合解啊   這道題用數組也完全可以解  ,  我覺得用Treemap  更高大上一點   

話不多說  直接上代碼  。

import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class MapTest {

	/*
	 * 練習:
	 * “asdadf  +- + +asdASJKHDKJGADada--++ashfklahsdkflha” 擷取該字元串中,每一個字母出現在的次數。
	 * 要求列印結果是:a(2)b(1)....;
	 * 對于結果的分析發現,字母和次數之間存在着映射關系,而且這種關系很多。
	 * 很多就需要存儲,能存儲映射關系的容器有數組和Map集合。
	 * 那就使用Map集合,又發現可以保證唯一性的一方具備着順序 a b c ....
	 * 是以使用treeMap集合。
	 * 
	 * 集合中存儲的是字母和次數的對應關系,
	 * 1.因為操作的是字元串中的字母,是以先将字元串變成字元數組。
	 * 2.周遊字元數組,用每一個字母作為鍵 去查Map集合的這個表。
	 * 3.如果字母鍵不存在,就将改字母作為鍵1作為值 存儲到Map集合中, 
	 * 鍵 相同  值會覆寫  這樣就記錄住了  該字母的次數     
	 * 周遊結束 map集合中就記住了 所有字母的次數。
	 * 
	 */
	public static void main(String[] args) {
		String str ="asdadf  +- + +asdASJKHDKJGADada--++ashfklahsdkflha";
		String s=getCharCount(str);
		System.out.println(s);
	}

	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;
			Integer value=map.get(chs[i]);
			int  count=1;
			if(value!=null)
				count=value+1;
			map.put(chs[i], count);
			//判斷是否為空
//			if(value==null)  這樣寫也可以 總是覺得效率有點低啊  
//				map.put(chs[i], 1);
//			else
//				map.put(chs[i], value+1);		
		}
		return MapToString(map);
	}

	private static String MapToString(Map<Character, Integer> map) {
		StringBuilder sb=new StringBuilder();
		Iterator<Character> it=map.keySet().iterator();
		while(it.hasNext()){
			Character key=it.next();
			Integer value=map.get(key);
			sb.append(key+"("+value+")");
		}
		return sb.toString();
	}

}