Pregunta

Según el javadoc HashSet, HashSet.contains sólo devuelve un valor booleano. ¿Cómo puedo "encontrar" un objeto en un hashset y modificarlo (que no es un tipo de datos primitivo)?

veo que HashTable tiene un método get (), pero yo preferiría usar el conjunto.

¿Fue útil?

Solución

Puede eliminar un elemento y añadir una diferente.

Modificación de un objeto mientras se está en un conjunto de hash es una receta para el desastre (si la modificación cambia el valor hash o comportamiento igualdad).

Otros consejos

Para citar la fuente de las acciones de 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;

Así que usted está pagando por un mapa, que también podría utilizarlo.

Se puede recorrer el conjunto para encontrar su objeto.

Una palabra de advertencia de la API doc sin embargo:

"Nota: El gran cuidado debe ejercerse si los objetos mutables se utilizan como elementos de establecer el comportamiento de un conjunto no se especifica si el valor de un objeto se cambia de una manera que afecta iguales comparaciones mientras que el objeto es. un elemento en el conjunto ".

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

Algo así como:

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

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

me encontré con el mismo problema y se le ocurrió la siguiente solución (que debe implementar la interfaz set, pero no todos los métodos son aquí)

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);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top