我想编写一个比较器,让我可以按值而不是默认的自然顺序对 TreeMap 进行排序。
我尝试过这样的事情,但无法找出问题所在:
import java.util.*;
class treeMap {
public static void main(String[] args) {
System.out.println("the main");
byValue cmp = new byValue();
Map<String, Integer> map = new TreeMap<String, Integer>(cmp);
map.put("de",10);
map.put("ab", 20);
map.put("a",5);
for (Map.Entry<String,Integer> pair: map.entrySet()) {
System.out.println(pair.getKey()+":"+pair.getValue());
}
}
}
class byValue implements Comparator<Map.Entry<String,Integer>> {
public int compare(Map.Entry<String,Integer> e1, Map.Entry<String,Integer> e2) {
if (e1.getValue() < e2.getValue()){
return 1;
} else if (e1.getValue() == e2.getValue()) {
return 0;
} else {
return -1;
}
}
}
我想我要问的是:我可以得到一个 Map.Entry
传递给比较器吗?
原文由 vito huang 发布,翻译遵循 CC BY-SA 4.0 许可协议
您不能让
TreeMap
本身对值进行排序,因为这违反了SortedMap
规范:但是,使用外部集合,您始终可以根据需要对
Map.entrySet()
进行排序,无论是通过键、值,还是两者的组合(!!)。这是一种返回A
SortedSet
Map
Comparable
Map.Entry
一个通用方法。现在您可以执行以下操作:
请注意,如果您尝试修改
SortedSet
本身或内部的Map.Entry
,则会发生奇怪的事情,因为这不再是原始地图的“视图”,例如entrySet()
是。一般而言,按值对地图条目进行排序的需求是非典型的。
关于
==
的注意事项Integer
您原来的比较器比较
Integer
使用==
。这几乎总是错误的,因为==
和Integer
操作数是引用相等,而不是值相等。相关问题
new Integer(i) == i
在 Java 中? (是的!!!)