JavaのHashSetの中で見つけると戻りオブジェクトにどのように
質問
HashSetのJavadocのによると、HashSet.containsはブール値を返します。どのように私は(それがプリミティブデータ型ではありません)HashSetのでオブジェクトを「検索」し、それを修正することができますか?
私は、ハッシュテーブルは、get()メソッドを持っていることがわかり、私はセットを使用することを好むだろう。
解決
あなたは要素を削除し、別のものを追加することができます。
(修飾は、ハッシュ値または等価の動作を変更した場合)、それはハッシュセットにある間、オブジェクトを変更することは、災害のためのレシピである。
他のヒント
株式日曜はjava.util.HashSetのソースを引用します:
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map;
あなたがマップのために払っているので、あなたは同様にそれを使用する場合があります。
あなたは、あなたのオブジェクトを見つけるために、セットを反復処理することができます。
APIからの警告の言葉ドキュメントにかかわらます:
の "注:オブジェクトがある間に可変オブジェクトがセット要素として使用される場合、細心の注意を払わなければならないオブジェクトの値が影響するように変更された場合、セットの動作が指定されていないが、比較に等しいですセット内の要素。」の
Object oldobj; //object to modify
if (hashset.remove(oldobj)) {
Object newobj; //modified object
hashset.add(newobj);
}
のような何かます:
MyObject obj = new MyObject();
HashSet hashSet = new HashSet();
hashSet.add(obj);
if (hashSet.contains(obj) == true) {
hashSet.remove(obj);
obj.setSomething();
hashSet.add(obj);
}
私は同じ問題が発生したため、次の解決策を考え出した(それが設定されたインタフェースを実装する必要はなく、すべての方法がここにある)
public class MySet<T> implements Set<T>{
private HashMap<T,T> items = new HashMap<T,T>();
public boolean contains(Object item)
{
return items.containsKey(item);
}
public boolean add(T item)
{
if (items.containsKey(item))
return false;
else
{
items.put(item, item);
return true;
}
}
public T get(T item)
{
return items.get(item);
}
}
所属していません StackOverflow