天天看点

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();
	}

}