Frage

Nach dem HashSet javadoc, kehrt HashSet.contains nur einen boolean. Wie kann ich ein Objekt in einem HashSet „finden“ und ändern Sie es (es ist nicht ein primitiver Datentyp)?

Ich sehe, dass HashTable eine Methode get (), aber ich würde es vorziehen, um das Set zu verwenden.

War es hilfreich?

Lösung

Sie können ein Element entfernen und fügen Sie eine andere.

Ändern ein Objekt, während es in einem Hash-Set ist ein Rezept für eine Katastrophe (wenn die Änderung des Hash-Wert oder Gleichheit Verhalten ändert).

Andere Tipps

die Quelle der Lager Sun java.util.HashSet zitieren:

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;

So Sie für eine Karte bezahlen, dann kann man auch verwenden.

Sie können durch das Set iterieren Ihr Objekt zu finden.

Ein Wort der Warnung von der API doc aber:

"Hinweis: Große Sorgfalt ausgeübt werden müssen, wenn veränderbare Objekte als Set-Elemente verwendet werden Das Verhalten eines Satzes ist nicht festgelegt, wenn der Wert eines Objekts in einer Weise verändert, die Vergleiche gleich wirkt, während das Objekt ist. ein Element in der Menge. "

Object oldobj; //object to modify
if (hashset.remove(oldobj)) {
   Object newobj; //modified object
   hashset.add(newobj);
}

So etwas wie:

MyObject obj = new MyObject();
HashSet hashSet = new HashSet();
hashSet.add(obj);

if (hashSet.contains(obj) == true) {
    hashSet.remove(obj);
    obj.setSomething();
    hashSet.add(obj);
}

ich das gleiche Problem gestoßen und kam mit der folgenden Lösung (es soll den Set-Schnittstelle implementieren, aber nicht alle Methoden sind hier)

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top