2017-05-29 13 views
-1

値を格納するのにHashSet<String>を使用していますが、一部のStringは同じハッシュコードを持っています。 HashSetが衝突をどのように処理するか。Java HashSet <String>オブジェクトの衝突

List<ClassA> getValuesFromA(){ 

} 

List<ClassA> getValuesFromB(){ 

} 

Set <String> a = new HashSet<String>(getValuesFromA()); // data overwritten due to hash code collision 

Set <String> b = new HashSet<String>(getValuesFromB()); // data overwritten due to hash code collision 

a.removeAll(b); 
a.stream().forEach(t -> t.setSomeValue(X)); 
b.addAll(a); 

私はHashSetを使って各要素のO(1)のマイナスbを見つけてからb +(a - b)を探しています。しかし、データをHashSetに格納すると、一部のデータが上書きされます。ハッシュメソッドやデータ構造を変更せずに誰でもこの操作を実行する考えがありますか?

+3

"しかし、データをHashSetに保存しているうちに、一部のデータが失われました。"もっときれいにしてください。ハッシュコードの衝突*はデータを失わないことに注意してください - 値を見つけるのが少し効率が悪くなるだけです。あなたの質問が現時点で不明なので、[mcve]を提供してください。 –

+3

(おそらく 'retainAll'、btwを使いたいだけです) –

+0

これをチェックしてください:https://stackoverflow.com/questions/2851938/efficiently-finding-the-intersection-of-a-variable-number-of-文字列の集合 –

答えて

0

しかし、データをHashSetに保存しているうちに、一部のデータが失われました。 これをどう処理するのですか?

hashCode()の衝突は、ハッシュセット内の同じハッシュコードを持つオブジェクトを緩めたり上書きしたりしません。
同じハッシュコードを持つ2つのオブジェクトを同じHashSetに格納することができます。

Set <String> a = new HashSet<String>(getValuesFromA()); 

Set <String> b = new HashSet<String>(getValuesFromB()); 

a.removeAll(b); 

aからは、bに含まれるすべての値を削除します。あなたのサンプルコードで

は、あなたがそれを行います。 したがって、 aは、 aマイナスb valuesを含みます。
除外を行います。

は、次に、あなたがやる:あなたはbbに含まれていないのみa値を追加すると

b.addAll(a); 

それが交差点ではありません。ジョンスキートにより示唆されるように

はあなたではなくretainAll()メソッドを使用する必要があり、それはあなたの条件に合うように思える:


が 指定されたコレクションに含まれているこのセットの要素だけを保持

Set<String> intersectionSet = new HashSet<>(getValuesFromA());  

intersectionSet.retainAll(getValuesFromB());