我想根据值的某些属性对 Java TreeMap 进行排序。具体来说,我想TreeMap<Integer, Hashset<Integer>>
根据 的大小对 a 进行排序Hashset<Integer>
。为了实现这一点,我做了以下工作:
比较器类:
private static class ValueComparer implements Comparator<Integer> {
private Map<Integer, HashSet<Integer>> map = null;
public ValueComparer (Map<Integer, HashSet<Integer>> map){
super();
this.map = map;
}
@Override
public int compare(Integer o1, Integer o2) {
HashSet<Integer> h1 = map.get(o1);
HashSet<Integer> h2 = map.get(o2);
int compare = h2.size().compareTo(h1.size());
if (compare == 0 && o1!=o2){
return -1;
}
else {
return compare;
}
}
}
一个使用示例:
TreeMap<Integer, HashSet<Integer>> originalMap = new TreeMap<Integer, HashSet<Integer>>();
//load keys and values into map
ValueComparer comp = new ValueComparer(originalMap);
TreeMap<Integer, HashSet<Integer>> sortedMap = new TreeMap<Integer, HashSet<Integer>>(comp);
sortedMap.putAll(originalMap);
问题:
originalMap
当包含超过 2 个相同大小的值时,这不起作用。对于其他情况,它可以正常工作。当映射中两个以上的值大小相同时,新排序映射中的第三个值为 null 并在我尝试访问它时抛出 NullPointerException。
我无法弄清楚问题是什么。如果有人能指出,我会很好。
更新: 这是一个在两个值具有相同大小时有效的示例:http: //ideone.com/iFD9c 在上面的示例中,如果您取消注释第 52-54 行,此代码将失败 - 这就是我的问题所在。