4

LinkedHashMapのように機能するが、equalsおよびhashCodeにも順序を反映するJavaコレクションはありますか?->同じ要素を持つが順序が異なる2つのマップは等しくなく、異なるハッシュコードを持つ必要があります。

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;
    }
...

(日食によって生成されたコードに基づいています)

4

4 に答える 4

2

hashCodeおよびHashMapと同等のものをオーバーライドできます。

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順序に基づいて同等性を計算する/を提供できます。MapequalshashCode

于 2012-08-28T15:07:06.583 に答える