java需要一个保持顺序并具有“顺序敏感”equals/hashCode的映射
是否有一个java集合可以像LinkedHashMap一样工作,但也可以在equals和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生成的代码)
# 1 楼答案
那http://docs.oracle.com/javase/1.5.0/docs/api/java/util/TreeMap.html呢
# 2 楼答案
《平等的契约》非常清楚平等的含义。(甚至java库^ {CD1}}违反java语法的事实,也就是Java集合教程的标准。)如果你考虑将契约与契约{“CD1}}”进行比较,违约LSP也会引起混淆。
一个干净的解决方案是一层间接的。引入一个包含但不实现
Map
(可以是任何实现,甚至可以在运行时更改实现,尽管可能不应该)的类,并执行它自己的equals
/hashCode
操作# 3 楼答案
可以用
Map
实现来包装LinkedHashMap
,并提供一个equals
/hashCode
来根据顺序计算等式# 4 楼答案
可以重写hashCode和HashMap的等号
因为HashMap没有顺序,这是非常危险的,但是如果你愿意,你可以这样做。你可能会发现比较每一个的toString()是你真正需要的
顺便说一句:为了了解一个HashMap的一个键可以有多少不同的顺序,这篇博客文章给了你一个使用HashSet(它使用相同的代码)的想法
http://vanillajava.blogspot.co.uk/2011/09/order-of-elements-in-hash-collection.html