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