黑马程序员技术交流社区

标题: Map中的排序问题 [打印本页]

作者: 张建峰    时间: 2012-8-11 19:38
标题: Map中的排序问题
如果把String类型转成字符型,统计次数后,怎么在Map中按照每个字符出现的次数升序进行排序?
作者: 黑马黄宏强    时间: 2012-8-11 19:42
解决方法代码如下:
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

public class CountTimes4String {

        public static void main(String[] args) {

                String src = "zaabbbccddd";

                Map map = charTimes(src);
                System.out.println(map);
        }

        /**
         * 返回一个字符串中字符出现次数的map集合(按出现次数排序)
         *
         * @param src
         *            接收一个字符串
         * @return 字符串中字符与出现次数的对应关系Map集合(按出现次数排序)
         */
        public static Map<Character, Integer> charTimes(String src) {
                Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
                // 建立每个字符和出现次数的map
                char[] charArr = src.toCharArray();
                for (char c : charArr)
                        if (map.get(c) == null)
                                map.put(c, 1);
                        else
                                map.put(c, map.get(c) + 1);
                /*
                 * 思路:因为map集合无法直接通过值排序,使用带排序功能的TreeSet来排序好后再存入Map,
                 * 需要保留存储顺序,所以使用LinkedHashMap
                 */
                Set<Map.Entry<Character, Integer>> set = new TreeSet<Map.Entry<Character, Integer>>( // 建立一个可以接受Map.Entry类型对象的集合,并按照比较器排序
                                new Comparator<Map.Entry<Character, Integer>>() { // 实现Map.Entry对象按值排序的内部类
                                        public int compare(Map.Entry<Character, Integer> o1,
                                                        Map.Entry<Character, Integer> o2) {
                                                return o1.getValue() - o2.getValue() == 0 ? o1.getKey()
                                                                .compareTo(o2.getKey()) : o1.getValue()
                                                                - o2.getValue();
                                        }
                                });
                set.addAll(map.entrySet()); // 实现Map.Entry对象按值排序
                map.clear();
                for (Map.Entry<Character, Integer> e : set)
                        map.put(e.getKey(), e.getValue());
                return map;
        }

}

运行结果为:
{z=1, a=2, c=2, b=3, d=3}

希望能对你有所帮助




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2