Question

Selon le javadoc HashSet, HashSet.contains renvoie uniquement une valeur booléenne. Comment puis-je « trouver » un objet dans un HashSet et le modifier (ce n'est pas un type de données primitive)?

Je vois que Hashtable a une méthode get (), mais je préférerais utiliser le jeu.

Était-ce utile?

La solution

Vous pouvez supprimer un élément et ajouter un autre.

Modification d'un objet alors qu'il est dans un jeu de hachage est une recette pour un désastre (si la modification modifie la valeur de hachage ou le comportement de l'égalité).

Autres conseils

Pour citer la source du stock 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;

Vous payez pour une carte, vous pourriez aussi bien l'utiliser.

Vous pouvez parcourir l'ensemble pour trouver votre objet.

Un mot d'avertissement de la API doc si:

"Remarque: Un grand soin doit être exercé que si les objets mutables sont utilisés comme éléments de définir le comportement d'un ensemble n'est pas spécifié si la valeur d'un objet est modifié d'une manière qui affecte égale des comparaisons alors que l'objet est. un élément de l'ensemble. "

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

Quelque chose comme:

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

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

J'ai rencontré le même problème et est venu avec la solution suivante (il faut mettre en œuvre l'ensemble d'interface, mais pas toutes les méthodes sont ici)

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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top