0

Map のキーとして MultiKey オブジェクトがあります。

キーは、名前 (文字列) と ID (int) で構成されます。

次の契約を満たす必要があります。両方のキーの名前が等しいか、両方のキーの ID が等しい場合、キーは等しくなければなりません。

この契約に違反しないようにするには、hashCode() 関数をどのように実装する必要がありますか? それは可能ですか?

equals の実装は簡単です...

if (name.equals(other.name) || id == other.id)
    return true;

しかし、hashMap は hashCode() のみを使用し、equals() を気にしないため、これは機能しません...

例:

Map A = [ ("tom",1)=TOMAS, ("eli",2)=ELIAS ]

A.get(new Key("tom",0))    should return TOMAS
A.get(new Key("",1))       should return TOMAS
A.get(new Key("eli",2))    should return ELIAS
...
4

2 に答える 2

1

これを行う唯一の方法は、キーの hashCode をキャッシュするために TreeSet のセットを作成することです。次に、現在の実行の hashCode 値として検出された最初の equals 値を使用します。
これに関する問題: 個別のキーが多数ある場合、余分なメモリを大量に使用する可能性があります。
b. hashCode 値は、プログラムの複数回の実行で必ずしも一貫しているわけではありません。
c. マルチスレッドの場合、キャッシュされた hashCode に対して同期が必要になります。

これを行うと、いつものように name と id を組み合わせて hashCode を簡単に生成できます。

于 2015-02-27T21:11:30.150 に答える
0

最悪のシナリオ:常に同じ hashCode を返す。仕様は簡単に言うと: - 2 つのオブジェクトが等しい場合、それらは同じ hashCode を持つ必要があります。2 つのオブジェクトが等しくない場合でも、同じ hashCode を持つことができます。hashCode は主にパフォーマンスのために存在します。

于 2015-02-27T20:52:57.770 に答える