【问题标题】:My treemap breaks after sorting it because "comparator used for the treemap is inconsistent with equals"我的树形图在排序后中断,因为“用于树形图的比较器与等于不一致”
【发布时间】:2013-07-31 04:42:18
【问题描述】:

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

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 不一致的比较器是什么意思。

【问题讨论】:

  • 你能在你得到空值的地方添加代码吗?

标签: java sorting map


【解决方案1】:

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

根据contract of the Comparable interface

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

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

我相信你需要换行:

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

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

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

【讨论】:

  • 当我执行“sortedData.firstKey()”时,它给了我正确的密钥,但是当我尝试“sortedData.get("sthingHere")”时,它每次都是空的。
  • @Macmee 你如何在Map 中输入值?你能告诉我们吗?
  • 我正在使用 put 方法将它们放入我的地图中,只是迭代项目列表(字符串,整数),例如 sortedData.put("Ardvark", 1000); sortedData.put("斑马", 99999);并且地图会自动按键自然排序,以便它具有 Ardvark 和 Zebra 的顺序,但是我希望我的树形图按值排序,以便我有 Zebra,然后是 Ardvark。我发布的方法对我的地图进行了很好的排序,我什至可以打印 sortedData.toString() 并查看它是否已排序,但如果我尝试 sortedData.get("Zebra") 则它返回 null。
【解决方案2】:

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

最好重写 hashCode() 方法以返回基于相同字段的哈希值。

【讨论】:

  • 但是在我的源代码中,我要为什么对象覆盖 equals() ?
猜你喜欢
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多