クラス(MyClass)のオブジェクトのセットをHashSetで処理したいと考えています。すでに存在するオブジェクト(MyClassのhashCodeに頼る)を追加しようとすると、このメソッドはfalseを返します。既に存在する実際のオブジェクトを返す方法/方法はありますか?Java Collections-> Hashset
addオブジェクトがfalseを返すときに、そのオブジェクトのコレクションを返すようにアドバイスしてください。
クラス(MyClass)のオブジェクトのセットをHashSetで処理したいと考えています。すでに存在するオブジェクト(MyClassのhashCodeに頼る)を追加しようとすると、このメソッドはfalseを返します。既に存在する実際のオブジェクトを返す方法/方法はありますか?Java Collections-> Hashset
addオブジェクトがfalseを返すときに、そのオブジェクトのコレクションを返すようにアドバイスしてください。
1つの可能な方法は、次のようになります。
myClass[] myArray = mySet.toArray(new myClass[mySet.size]);
List myList = Arrays.asList(myArray);
MyClass myObject = myList.get(myList.indexof(myObject));
しかし、もちろん、一部の人々は、それが挿入されますが失敗した場合はもちろん、あなたが何をしたいという場合を除き、その要素は、あなたが探している要素であり、指摘されたようにそのメモリロケーションに格納され、equals
とhashCode
には、論理的に等しいオブジェクトではなく、==
オブジェクトが通知されます。
HashSet
を使用している場合は、私が知っている限り、あなたはすべてを反復し、それぞれをequals()
と呼ぶ以外は行うことはできません。しかし、HashMap
を使用して、すべてのオブジェクトをそれ自身にマップすることができます。次に、put()
を呼び出して、以前にマップされた値があればそれを返します。
ショート、いや、単に値にequal
あるセットの既存のメンバーを取得する方法はありません追加されました。これを行う最善の方法は、追加された各値をそれ自身にマップするセットラッパーをHashMap
のまわりに書くことです。あなたはあなたが好きかどうかをチェックするために、そのメソッドを使用することができます
http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html#contains(java.lang.Object)。あなたが覚えておかなければならないことは、あなたはすでに存在するオブジェクトを持っているということです。。
equals(..)
がtrue
の場合、オブジェクトは同じであるため、セットに追加しようとしているものを使用できます。
なぜあなたが追加しようとしているオブジェクトを返すのですか?あなたはすでにそれを持っています!
はちょうどような何か:それは所望の結果を達成していない場合
if (!set.add(item)) {
// It already contains the item.
doSomethingWith(item);
}
を、それは単に項目のequals()
が不十分実装されていることを意味します。
'add'を呼び出して' false'を返すと、既にオブジェクトを持っているはずです - あなたがそれを渡そうとしました! –
@ Josh.trowこれは間違いありませんが、OPが望んでいるのは、論理的に等しいオブジェクトではなく、そのメモリ位置のオブジェクトです。 –