排序后我的树图会中断,因为“用于树图的比较器与equals不一致”

时间:2013-07-31 04:42:18

标签: java sorting map

我需要根据它的值对树形图进行排序。我正在做的事情的要求是我必须使用有序地图。我在这里尝试了解决方案: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。

我也不明白比较器与等于偶数意味着什么不相符。

2 个答案:

答案 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()方法以返回基于相同字段的哈希值。