Domanda

Secondo il javadoc HashSet, HashSet.contains restituisce solo un valore booleano. Come faccio a "trovare" un oggetto in un HashSet e modificarlo (non è un tipo di dati primitivi)?

vedo che HashTable ha un metodo get (), ma io preferirei usare il set.

È stato utile?

Soluzione

È possibile rimuovere un elemento e aggiungere un altro.

Modifica di un oggetto mentre è in un set hash è una ricetta per il disastro (se la modifica cambia il valore hash o comportamento uguaglianza).

Altri suggerimenti

Per citare la fonte del titolo Sun 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;

Quindi, si sta pagando per una mappa, si potrebbe anche usare.

È possibile scorrere il set per trovare il tuo oggetto.

Una parola di avvertimento dal API doc però:

"Nota: Grande attenzione deve essere esercitata se gli oggetti mutabili vengono utilizzati come elementi di impostare il comportamento di un insieme non è specificato se il valore di un oggetto viene modificato in un modo che colpisce è uguale paragoni mentre l'oggetto è. un elemento nel set. "

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

Qualcosa di simile:

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

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

Ho incontrato lo stesso problema e si avvicinò con la seguente soluzione (dovrebbe implementare l'interfaccia Set, ma non tutti i metodi sono qui)

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top