0

我需要根据它的值对我的树形图进行排序。我正在做的事情的要求是我必须使用排序地图。我在这里尝试了解决方案:按值(Java)对 Map<Key, Value> 进行排序,但是正如评论所说,这将使从我的地图中获取值不起作用。所以,我做了以下事情:

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(/ anything /) 时,它始终为空。

我也不明白与 equals even 不一致的比较器是什么意思。

4

2 回答 2

1

我也不明白与 equals even 不一致的比较器是什么意思。

根据Comparable 接口的合同

当且仅当 e1.compareTo(e2) == 0 对于类 C 的每个 e1 和 e2 具有与 e1.equals(e2) 相同的布尔值时,类 C 的自然排序被称为与 equals 一致。注意null 不是任何类的实例,即使 e.equals(null) 返回 false,e.compareTo(null) 也应该抛出 NullPointerException。

强烈建议(尽管不是必需的)自然排序与 equals 一致。

我相信您需要更改线路:

 _referenceMap.get(a) >= _referenceMap.get(b) ? -1 : 1;

 _referenceMap.get(a).compareTo(_referenceMap.get(b));

因为如果Integer返回的_referenceMap.get(a)实际上是返回的==值,那么理想情况下你应该返回,而不是。Integer_referenceMap.get(b)0-1

于 2013-07-31T04:45:34.233 回答
0

这意味着您必须实现(即覆盖)该equals()方法来比较您正在为该方法比较的相同字段compareTo()

重写该hashCode()方法以返回基于相同字段的哈希也是一种很好的做法。

于 2013-07-31T04:48:39.013 回答