A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张建峰 初级黑马   /  2012-8-11 19:38  /  1334 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果把String类型转成字符型,统计次数后,怎么在Map中按照每个字符出现的次数升序进行排序?

1 个回复

倒序浏览
解决方法代码如下:
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}

希望能对你有所帮助

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马