在Java中,通过key.length()对哈希映射进行排序

sef*_*osu 7 java sorting hashmap treemap comparator

我有这样的hashmap:

HashMap<String,Integer> map = new HashMap<String,Integer>();
map.put("java",4);
map.put("go",2);
map.put("objective-c",11);
map.put("c#",2);
Run Code Online (Sandbox Code Playgroud)

现在我想按键长度排序这个映射,如果两个键长度相等(例如go和c#都是长度2),那么按照alphba顺序排序.所以我期望得到的结果是这样的:

打印结果:objective-c,11 java,4 c#,2 go,2

这是我自己的玩具,但它根本不起作用......

      HashMap<String,Integer> map = new HashMap<String,Integer>();
          map.put("java",4);
          map.put("go",2);
          map.put("objective-c",11);
          map.put("c#",2);

      Map<String,Integer> treeMap = new TreeMap<String, Integer>(
                new Comparator<String>() {
                    @Override
                    public int compare(String s1, String s2) {
                        return s1.length().compareTo(s2.length());
                    }
                }
        );
Run Code Online (Sandbox Code Playgroud)

实际上'compareTo'方法显示为红色(无法编译)....请有人帮我一些代码示例...我有点困惑如何使用比较器类来自定义比较对象...

man*_*uti 14

编译器抱怨,因为你不能打电话compareToint.对地图进行排序的正确方法如下:

Map<String, Integer> treeMap = new TreeMap<String, Integer>(
    new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            if (s1.length() > s2.length()) {
                return -1;
            } else if (s1.length() < s2.length()) {
                return 1;
            } else {
                return s1.compareTo(s2);
            }
        }
});
Run Code Online (Sandbox Code Playgroud)

前两个条件比较两个Strings 的长度并相应地返回正数或负数.String如果长度相等,第三个条件将按字典顺序比较.


Mar*_*nik 5

您调用String#length(),它返回一个原语int。您需要静态方法Integer.compare(int,int)。如果您使用的是Java 8,则可以节省很多输入:

Map<String,Integer> treeMap = new TreeMap<>(
        Comparator.comparingInt(String::length)
                  .thenComparing(Function.identity()));
Run Code Online (Sandbox Code Playgroud)