Pergunta

De acordo com o javadoc HashSet, HashSet.contains retorna apenas um booleano.Como posso “encontrar” um objeto em um hashSet e modificá-lo (não é um tipo de dados primitivo)?

Vejo que HashTable tem um método get(), mas prefiro usar o set.

Foi útil?

Solução

Você pode remover um elemento e adicionar um diferente.

Modificar um objeto enquanto estiver em um conjunto de hash é uma receita para desastre (se a modificação alterar o valor do hash ou o comportamento da igualdade).

Outras dicas

Para citar a fonte do estoque 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;

Então você está pagando por um mapa, também pode usá -lo.

Você pode percorrer o conjunto para encontrar seu objeto.

Uma palavra de advertência do Documento da API no entanto:

"Observação:Deve-se ter muito cuidado se objetos mutáveis ​​forem usados ​​como elementos de conjunto.O comportamento de um conjunto não é especificado se o valor de um objeto for alterado de uma maneira que afete comparações de igualdade enquanto o objeto for um elemento do conjunto."

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

Algo 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);
}

Encontrei o mesmo problema e criei a solução a seguir (ela deve implementar a interface definida, mas nem todos os métodos estão aqui)

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top