是否有一个类似于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生成的代码)
答案 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
,根据订单计算相等性。