我需要根据它的值对树形图进行排序。我正在做的事情的要求是我必须使用有序地图。我在这里尝试了解决方案:Sort a Map<Key, Value> by values (Java)但是正如评论所说,这将使我的地图中的值无法正常工作。所以,我做了以下事情:
class sorter implements Comparator<String> {
Map<String, Integer> _referenceMap;
public boolean sortDone = false;
public sorter(Map<String, Integer> referenceMap) {
_referenceMap = referenceMap;
}
public int compare(String a, String b) {
return sortDone ? a.compareTo(b) : _referenceMap.get(a) >= _referenceMap.get(b) ? -1 : 1;
}
}
所以我将sortDone保留为false,直到我完成对地图的排序,然后我将sortDone切换为true,以便比较正常情况。问题是,我仍然无法从我的地图中获取项目。当我执行myMap.get(/ 任何 /)时,它仍然是null。
我也不明白比较器与等于偶数意味着什么不相符。
答案 0 :(得分:1)
我也不明白比较器与等于偶数意味着什么不相符。
根据contract of the Comparable interface。
当且仅当e1.compareTo(e2)== 0与c1的每个e1和e2的e1.equals(e2)具有相同的布尔值时,C类的自然排序被认为与equals一致。请注意,null不是任何类的实例,并且e.compareTo(null)应该抛出NullPointerException,即使e.equals(null)返回false。
强烈建议(尽管不要求)自然排序与等于一致。
我相信你需要改变这条线:
_referenceMap.get(a) >= _referenceMap.get(b) ? -1 : 1;
到
_referenceMap.get(a).compareTo(_referenceMap.get(b));
由于Integer
返回的_referenceMap.get(a)
实际上==
与[{1}}返回的Integer
的值相同,那么理想情况下应该返回_referenceMap.get(b)
},而不是0
。
答案 1 :(得分:0)
这意味着您必须实现(即覆盖)equals()
方法来比较您为compareTo()
方法进行比较的相同字段。
优良作法是覆盖hashCode()
方法以返回基于相同字段的哈希值。