【问题标题】:need a map that preserves order and has "order sensitive" equals/hashCode需要一个保留顺序并具有“顺序敏感”等于/hashCode 的地图
【发布时间】:2012-08-29 15:16:19
【问题描述】:

有没有像 LinkedHashMap 一样工作的 java 集合,但也反映了 equals 和 hashCode 中的顺序? -> 两个元素相同但顺序不同的 Map 不应该相等,应该有不同的 hashCode。

解决方案基于 Peter Lawrey 的回答(xAxis 是 LinkedHashMap):

哈希码:

...
result = prime * result + ((xAxis == null) ? 0 : xAxis.hashCode() + xAxis.toString().hashCode());
...

等于:

...
if (xAxis == null) {
        if (other.xAxis != null) {
            return false;
        }
    } else if (!xAxis.equals(other.xAxis)) {
        return false;
    } else if (!xAxis.toString().equals(other.xAxis.toString())) {
        return false;
    }
...

(基于eclipse生成的代码)

【问题讨论】:

  • 不。仅当您在类中为“订单”创建字段时
  • 你试过guava.Maps.difference(left,right)吗?
  • 似乎 guava.Maps.difference(left, right) 对顺序不敏感?!

标签: java collections


【解决方案1】:

您可以覆盖 HashMap 的 hashCode 和 equals。

由于 HashMap 没有顺序,这是非常危险的,但如果你愿意,你可以这样做。您可能会发现,比较每个的 toString() 就是您真正需要的。

顺便说一句:为了了解您可以对 HashMap 的键有多少不同的顺序,这篇博文为您提供了一个使用 HashSet(使用相同的代码)的想法

http://vanillajava.blogspot.co.uk/2011/09/order-of-elements-in-hash-collection.html

【讨论】:

  • 为什么不覆盖 LinkedHashMap 的 equals 和 hashCode?​​span>
  • 如果顺序对您很重要,您可以覆盖 LinkedHashMap 的 equals 和 hashCode。同样,您可能会发现只需比较 toString() 即可。
  • 我在重写equals/hashCode 时遇到的唯一问题是它与AbstractMap 冲突。可能在使用 map-> 好主意的对象中覆盖 equal 就足够了 - 使用 toString!
  • @dermoritz 我一直使用toString 是集合的单元测试。这是检查所有元素是否符合预期的快速方法。我也倾向于使用 LinkedHashMap 而不是 HashMap,这样元素的顺序就更容易预测了。 (这也使调试更容易)
【解决方案2】:

Map 的合约非常清楚平等的含义。 (事实上​​,即使是 Java 库 Maps 违反合同也适用于 Java 集合课程。)如果您考虑将遵守合同的 Map 与合同破坏者进行比较,那么破坏 LSP 也会引起混淆。

一个干净的解决方案是间接层。引入一个包含但不实现 Map 的类(可以是任何实现,甚至可以在运行时更改实现,尽管可能不应该这样做)并且是它自己的 equals/hashCode 事情。

【讨论】:

  • 点赞“地图合约”。这也是我对简单地覆盖 hashCode/equals 的担忧。我在使用地图的类中覆盖了 equals/hashCode。
【解决方案3】:

【讨论】:

  • 你可以使用 Java 7 javadoc 吗?
  • 你知道 Java 5 的 EOL 是 3 年前吗?
  • 树图是最糟糕的——它改变了我想要保存的顺序。
  • 如果您下订单,它会NOT - 指定您自己的比较器方法来维护您的订单。 @StephenC - 抱歉,这是 Google 中出现的第一个链接,直到现在我才注意到 Java 版本 - docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html 是最新的
  • 问题是要保留的顺序是随机的——用户设置顺序!
【解决方案4】:

您可以用Map 实现包装LinkedHashMap,并提供基于顺序计算相等性的equals/hashCode

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2018-05-16
    相关资源
    最近更新 更多