2017-12-04 38 views
0

このexampleは、それが簡単に見える:オブジェクトが既にHashSetに存在するかどうかをチェックする方法?

HashSet<Integer> hSet = new HashSet<Integer>(); 

hSet.add(new Integer("1")); 
hSet.add(new Integer("2")); 
hSet.add(new Integer("3")); 

System.out.println(hSet.contains(new Integer("3"))); 

しかし、私はムービーオブジェクト(私が確認したい)上でそれを使用する:

Set<Movie> hSet = new HashSet<Movie>(); 

hSet.add(new Movie(222, "Lord of the Rings", "something")); 
System.out.println(hSet); 

System.out.println(hSet.contains(new Movie(222, "Lord of the Rings", "something"))); 

HSETプリントは示しています

[ID:222name:ロードオブザリング]

私は新しい整数を追加したり、新しいムービーオブジェクトを追加することで違いが表示されませんリスト。では、なぜ私の例は機能していないのですか?

//編集。

誰かが良いリファレンスをお探しの場合はthis helped me outです。

+0

'Movie'は' equals() 'と' hashCode() 'を正しく実装していますか? –

+0

この違いの理由は、 'Integer'が' hashCode'と 'equals'をオーバーライドするのに対して、' Movie'はそうではありません。 – dasblinkenlight

+0

Hashing thingy内で正しく動作するため、ムービークラスはhashCode()を実装する必要があります。 equals()を実装することも良いことです。 Integerはこれらの2つのメソッドをオーバーライドしますが、あなたのクラスはそうではありません。 – GhostCat

答えて

1

ムービークラスのhashcodeおよびメソッドをオーバーライドする必要があります。

それはハッシュコードをオーバーライドするすることにより、オブジェクトのhashcode値をチェックするオブジェクトを追加する前に、我々は、オブジェクトを追加するたびにHashSetので 算出したハッシュコード値は、それ意志コールイコールセットですでに使用可能である場合メソッドを呼び出して、追加しようとしているオブジェクトがset内の既に利用可能なオブジェクトと等しいかどうかを確認します。 オブジェクトが等しい場合は、をセットに追加しません。そうでない場合は、オブジェクトをセットに追加します。

関連する問題