有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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


共 (4) 个答案

  1. # 2 楼答案

    《平等的契约》非常清楚平等的含义。(甚至java库^ {CD1}}违反java语法的事实,也就是Java集合教程的标准。)如果你考虑将契约与契约{“CD1}}”进行比较,违约LSP也会引起混淆。

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

  2. # 3 楼答案

    可以用Map实现来包装LinkedHashMap,并提供一个equals/hashCode来根据顺序计算等式

  3. # 4 楼答案

    可以重写hashCode和HashMap的等号

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

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

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