需要一个保留顺序的地图,并且具有“顺序敏感”等于/ hashCode

时间:2012-08-28 13:47:15

标签: java collections

是否有一个类似于LinkedHashMap的java集合,但是在equals和hashCode中也反映了这个顺序? - >两个具有相同元素但顺序不同的地图不应该相等,并且应该具有不同的hashCodes。

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

的hashCode:

...
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 个答案:

答案 0 :(得分:2)

您可以覆盖hashCode和HashMap的等号。

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

顺便说一句:为了了解你可以为HashMap的密钥订购多少个不同的订单,这篇博文给你一个使用HashSet的想法(使用相同的代码)

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

答案 1 :(得分:1)

Map的合同非常清楚平等意味着什么。 (甚至Java库Map打破合同的事实也是Java集合课程的标准。)如果你考虑比较符合合同的Map和合同,打破LSP也会引起混淆 - 断路器。

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

答案 2 :(得分:0)

答案 3 :(得分:0)

您可以使用LinkedHashMap实施包装Map并提供equals / hashCode,根据订单计算相等性。