2017-01-24 6 views
4

これは「解決する必要がある」という質問よりも「理解しようとする」質問のほうが多いです。割り当ての場合、itemNumberpriceの商品リストを作成するよう依頼されましたが、それぞれが1つのみで、同じitemNumberの商品はありません。私はセットを作ることができたと思って、それは重複の問題を取り除くでしょう。しかし、producta 1、4.99およびproductb 1、2.99を追加すると、両方の製品が追加されます。セットは重複をいつ許可しますか?

これは、これらの製品が異なる価格であると判断することを意味しますか?つまり、価格が異なるため、セットに追加することができますか?

+1

どのようなセットの実装を使用していますか? – Eran

+4

Wetherであるかどうかにかかわらず、2つのオブジェクトが等しいとみなすSetは、オブジェクトクラスのequalsおよびhashCode実装に依存します(通常は)。 Productクラスの2つのメソッドを実装/オーバーライドしましたか? –

+1

@NikRawlinsあなたがequals/hashcodeを定義する必要があるProductのjava.util.HashSetを持っている場合。そうでなければ(jdk-8賢明な)ハッシュコードはmasrsaliag xor shiftの実装で計算され、ハッシュコードはアイデンティティハッシュコードです - これはおそらくあなたが望むものではありません – Eugene

答えて

5

あなたはjava.util.Setのフォームを使用していると仮定します。 Javaのセットでは、equalsメソッドを使用して2つのオブジェクトを比較します。比較したいクラスのequalsメソッド(Product)をオーバーライドして、アイテム番号が一致したときに等しいことをセットに伝えたいとします。

https://docs.oracle.com/javase/7/docs/api/java/util/Set.html

編集:911DidBushとトッド・シーウェルが述べたように、あなたがequalsメソッドをオーバーライドする時はいつでも、あなたはまた、ハッシュコードの契約を壊さないためのようhashCodeメソッドをオーバーライドすることになるでしょう。 Javaのドキュメントから
:等しいオブジェクトが等しくなければならないことを述べ、このメソッドがオーバーライドされたときのhashCodeメソッドの一般的な契約を維持するように、hashCodeメソッドをオーバーライドすることが必要であること

注、ハッシュコード。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

+3

hashCodeメソッドもオーバーライドする必要があることを追加する必要があります。 equalsメソッドをオーバーライドし、それをHashSetで使用しようとする場合は、たとえば災害のレシピです。 –

+2

"HashSetを使用している場合は、' hashCode'メソッドをオーバーライドしたい場合もあります。 equalsをオーバーライドする場合は、 'equals'の規約に準拠するために' hashcode'をオーバーライドする必要があります。 –

+1

この回答はコメントとの組み合わせでわかりました。お返事ありがとうございます! –

5

Set javadocからの引用:

重複要素のないコレクションです。より正式には、e1.equals(e2)、最大でも1つのヌル要素のような要素e1とe2のペアは含まれません。

2つのオブジェクトが同じと見なされるかどうかは、それに応じてequalsという名前のメソッドを呼び出すことによって判断されます。 equalsを実装するときには、を実装する必要があります(hereおよびequals javadoc)。

関連する問題