import java.util.*;
public class Sort {
static class ValueComparator implements Comparator<String> {
Map<String, Integer> base;
ValueComparator(Map<String, Integer> base) {
this.base = base;
}
@Override
public int compare(String a, String b) {
if (base.get(a) >= base.get(b)) {
return 1;
} else {
return -1;
}
}
}
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<String, Integer>();
ValueComparator vc = new ValueComparator(map);
TreeMap<String, Integer> sorted = new TreeMap<String, Integer>(vc);
map.put("A", 1);
map.put("B", 2);
sorted.putAll(map);
for (String key : sorted.keySet()) {
System.out.println(key + " : " + sorted.get(key)); // why null values here?
}
System.out.println(sorted.values()); // But we do have non-null values here!
}
}
输出:
A : null
B : null
[1, 2]
BUILD SUCCESSFUL (total time: 0 seconds)
我想知道为什么我们在第一个注释行获取空值,而我们确实有非空值,如第二个注释行所示。
编辑:@ null的版本似乎无效。我改变了我的代码如下:
public int compare(String a, String b) {
if (a.equals(b)) return 0;
if (base.get(a) >= base.get(b)) {
return 1;
} else return -1;
}
它似乎有效,但我不确定。
答案 0 :(得分:11)
我的猜测是你的ValueComparator.compare()
方法永远不会返回0,表示相等,导致Map.get()
方法找不到匹配项。
答案 1 :(得分:2)
以这种方式更改比较
public int compare(String a, String b) {
if (base.get(a) > base.get(b)) {
return 1;
}else if(base.get(a) == base.get(b)){
return 0;
}
return -1;
}
答案 2 :(得分:2)
即使您的比较器肯定已损坏,如果您将其更改为
,该程序仍然有效for (Map.Entry e : sorted.entrySet()) {
System.out.println(e.getKey() + " : " + e.getValue());
}