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

我有这样的hashmap:

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

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

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

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

  HashMap map = new HashMap(); map.put("java",4); map.put("go",2); map.put("objective-c",11); map.put("c#",2); Map treeMap = new TreeMap( new Comparator() { @Override public int compare(String s1, String s2) { return s1.length().compareTo(s2.length()); } } ); 

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

编译器抱怨,因为你不能在int上调用compareTo 。 对地图进行排序的正确方法如下:

 Map treeMap = new TreeMap( new Comparator() { @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 treeMap = new TreeMap<>( Comparator.comparingInt(String::length) .thenComparing(Function.identity())); 

因为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 map = new HashMap(); map.put("java",4); map.put("go",2); map.put("objective-c",11); map.put("c#",2); Map treeMap = new TreeMap( new Comparator() { @Override public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } } ); treeMap.putAll(map); System.out.println(treeMap); } } 

如果使用TreeMap 不是强制性的

说明 :定义Comaprator ,下一步,定义一个列表,以便我们可以将所有映射条目添加到列表中。 最后,按定义的Comaprator对列表进行排序

代码

  Comparator> byMapValues = (Map.Entry left, Map.Entry right) ->left.getValue().compareTo(right.getValue()); List> 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> byMapKeys = (Map.Entry left, Map.Entry right) -> left.getKey().compareTo(right.getKey()); 
  public int compare(String o1, String o2) { return o1.length() == o2.length() ? o1.compareTo(o2) : o1.length() - o2.length(); } 

比较器应该是:

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