2011-08-16 9 views
1

クラス(MyClass)のオブジェクトのセットをHashSetで処理したいと考えています。すでに存在するオブジェクト(MyClassのhashCodeに頼る)を追加しようとすると、このメソッドはfalseを返します。既に存在する実際のオブジェクトを返す方法/方法はありますか?Java Collections-> Hashset

addオブジェクトがfalseを返すときに、そのオブジェクトのコレクションを返すようにアドバイスしてください。

+4

'add'を呼び出して' false'を返すと、既にオブジェクトを持っているはずです - あなたがそれを渡そうとしました! –

+2

@ Josh.trowこれは間違いありませんが、OPが望んでいるのは、論理的に等しいオブジェクトではなく、そのメモリ位置のオブジェクトです。 –

答えて

0

1つの可能な方法は、次のようになります。

myClass[] myArray = mySet.toArray(new myClass[mySet.size]); 
List myList = Arrays.asList(myArray); 
MyClass myObject = myList.get(myList.indexof(myObject)); 

しかし、もちろん、一部の人々は、それが挿入されますが失敗した場合はもちろん、あなたが何をしたいという場合を除き、その要素は、あなたが探している要素であり、指摘されたようにそのメモリロケーションに格納され、equalshashCodeには、論理的に等しいオブジェクトではなく、==オブジェクトが通知されます。

0

HashSetを使用している場合は、私が知っている限り、あなたはすべてを反復し、それぞれをequals()と呼ぶ以外は行うことはできません。しかし、HashMapを使用して、すべてのオブジェクトをそれ自身にマップすることができます。次に、put()を呼び出して、以前にマップされた値があればそれを返します。

4

HashSetのは、あなたがオブジェクトだ含まれている場合だけチェック:セットを反復処理の

if (hashSet.contains(obj)) { 
doWhateverWith(obj); 
} 
+2

"== true"部分は重複して冗長です。 – glmxndr

+0

申し訳ありませんが私は半分眠っていた:D – Headshota

+0

これはまた、質問に答えることはありません。あなたはまだセットにオブジェクトを持たず、それと同等のオブジェクトを1つだけ持ちます。 – Jorn

2

ショート、いや、単に値にequalあるセットの既存のメンバーを取得する方法はありません追加されました。これを行う最善の方法は、追加された各値をそれ自身にマップするセットラッパーをHashMapのまわりに書くことです。あなたはあなたが好きかどうかをチェックするために、そのメソッドを使用することができます

1

equals(..)trueの場合、オブジェクトは同じであるため、セットに追加しようとしているものを使用できます。

1

なぜあなたが追加しようとしているオブジェクトを返すのですか?あなたはすでにそれを持っています!

はちょうどような何か:それは所望の結果を達成していない場合

if (!set.add(item)) { 
    // It already contains the item. 
    doSomethingWith(item); 
} 

を、それは単に項目のequals()が不十分実装されていることを意味します。

関連する問題