import java.util.Map; import java.util.TreeMap; public class MapTest { /** * @param args */ public static void main(String[] args) { /* * 练习: * "abcdvbzvadsza"获取该字符串中每个字母出现的次数, * 要求结果是: 字母(次数)字母(次数) 如:a(2)b(3)c(1)e(5)... * * 思路: * 1,发现字母和次数之间存在对应关系。也就是映射关系,这就让我想到了map集合。 * 2,map集合中应该存储是字母和次数,键是字母,值是次数。 * 3,将map作为一张表,使用了查表法思想。对字符串中的每一个字母都去map表中进行次数的查找。 * 如果没有找到对应的次数,就将该字母和1存储到表中。 * 如果找到了对应的次数,就将该次数取出,并对该次数自增后,在将该字母和新的次数重新存入表中, * 对应map集合而言,键相同,值会覆盖。 * 4,所有的字母都查询完毕后,map表就有了所有字母和次数的对应关系, * 5,在将这些对应关系变成指定格式的字符串即可。 */ String str = "abc+advba-zvad,asza"; String s = getCharCount(str); System.out.println(s); } public static String getCharCount(String str) { //1,先将字符串转成字符数组。 char[] chs = str.toCharArray(); //2,定义一个map容器。作为存储字母和次数的表。 Map<Character,Integer> map = new TreeMap<Character,Integer>(); for (int i = 0; i < chs.length; i++) { //判断是否是字母。 if(!(chs>='a' && chs<='z' || chs>='A' && chs<='Z')) continue; //3,将遍历到的每一个字母都作为键去查表。获取次数。 Integer value = map.get(chs); int count = 0; if(value!=null){ count = value; } count++; map.put(chs, count); /*if(value==null)//该字母不存在。将该字母和1次存入。 map.put(chs, 1); else{ value++; map.put(chs, value); }*/ } // System.out.println(map); return mapToString(map); } private static String mapToString(Map<Character, Integer> map) { StringBuilder sb = new StringBuilder(); for(Map.Entry<Character, Integer> me : map.entrySet()){ Character key = me.getKey(); Integer value = me.getValue(); sb.append(key+"("+value+")"); } return sb.toString(); } } |