4

有没有像 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生成的代码)

4

4 回答 4

2

您可以覆盖 HashMap 的 hashCode 和 equals。

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

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

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

于 2012-08-28T13:55:11.597 回答
1

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

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

于 2012-08-28T14:39:57.413 回答
0

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/TreeMap.html怎么样

于 2012-08-28T13:54:17.043 回答
0

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

于 2012-08-28T15:07:06.583 回答