在Java中,根据hash映射的key.length()对其进行排序



我有一个这样的哈希图:

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

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

打印结果:目标-c,11java,4c#,2go,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());
                    }
                }
        );

实际上"compareTo"方法显示为红色(无法编译)。。。。请有人帮我举一些代码示例。。。我对如何使用comparator类自定义comparator对象有点困惑。。。

编译器正在抱怨,因为您无法在int上调用compareTo。正确的地图排序方式如下:

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

前两个条件比较两个String的长度,并相应地返回正数或负数。如果String的长度相等,则第三个条件将以字典方式比较它们。

您调用String#length(),它返回一个基元int。您需要静态方法Integer.compare(int,int)。如果你使用的是Java 8,你可以省去很多打字:

Map<String,Integer> treeMap = new TreeMap<>(
        Comparator.comparingInt(String::length)
                  .thenComparing(Function.identity()));
public int compare(String o1, String o2) {
  return o1.length() == o2.length() ? o1.compareTo(o2) : o1.length() - o2.length();
}

因为length()没有定义compareTo方法,所以您会看到错误。要更正,请使用下方的Integer.compare(s1.length(), s2.length());更新代码

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class Test {
    public static void main(String[] args) {
        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 Integer.compare(s1.length(), s2.length());
                    }
                }
        );
        treeMap.putAll(map);
        System.out.println(treeMap);
    }
}

如果树映射不是强制性的

Explantion:定义一个Comaprator,下一步,定义一个列表,这样我们就可以将所有映射条目添加到列表中。最后,根据定义的Comaprator 对列表进行排序

代码

 Comparator<Map.Entry<String,Integer>> byMapValues = 
         (Map.Entry<String,Integer> left, Map.Entry<String,Integer> right) ->left.getValue().compareTo(right.getValue());
 List<Map.Entry<String,Integer>> list = new ArrayList<>();
 list.addAll(map.entrySet());
 Collections.sort(list, byMapValues);
 list.forEach( i -> System.out.println(i));

输出

c#=2
go=2
java=4
objective-c=11

注意:按数字排序

如果需要根据关键字进行比较,可以使用以下行。

Comparator<Map.Entry<String,Integer>> byMapKeys = 
             (Map.Entry<String,Integer> left, Map.Entry<String,Integer> right) -> left.getKey().compareTo(right.getKey());

比较器应为:

new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return Integer.compare(s1.length(), s2.length());
    }
}

最新更新