web-dev-qa-db-fra.com

Remplacement d'un membre Java HashSet

J'ai ensemble de cette structure. Je n'ai pas de doublons, mais lorsque j'appelle: Set.add (élément) -> et il y a déjà un élément exact pour lequel j'aimerais que l'ancien soit remplacé.

import Java.io.*;

public class WordInfo implements Serializable {
    File plik;
    Integer wystapienia;

    public WordInfo(File plik, Integer wystapienia) {
        this.plik = plik;
        this.wystapienia = wystapienia;
    }

    public String toString() {
    //  if (plik.getAbsolutePath().contains("src") && wystapienia != 0)
            return plik.getAbsolutePath() + "\tWYSTAPIEN " + wystapienia;
    //  return "";
    }
    @Override
    public boolean equals(Object obj) {
        if(this == obj) return true;
        if(!(obj instanceof WordInfo)) return false;
        return this.plik.equals(((WordInfo) obj).plik);
    }

    @Override
    public int hashCode() {        
        return this.plik.hashCode();
    }
}
17
Yoda

Faites une suppression avant chaque ajout:

 someSet.remove(myObject);
 someSet.add(myObject);

La suppression supprimera tout objet égal à myObject. Vous pouvez également vérifier le résultat de l'ajout:

 if(!someSet.add(myObject)) {
     someSet.remove(myObject);
     someSet.add(myObject);
 }

Ce qui serait plus efficace dépend de la fréquence des collisions. S'ils sont rares, le second formulaire ne fait généralement qu'une seule opération, mais en cas de collision, il en fait trois. La première forme fait toujours deux.

32
Patricia Shanahan

Si l'ensemble contient déjà un élément qui equals() est l'élément que vous essayez d'ajouter, le nouvel élément ne sera pas ajouté et ne remplacera pas l'élément existant. Pour garantir que le nouvel élément est ajouté, supprimez-le simplement de l'ensemble:

set.remove(aWordInfo);
set.add(aWordInfo);
3
Ted Hopp

Essayez quelque chose comme suit (cela n’aura de sens que si les equals et hashCode dépendent d’un champ, mais les autres champs peuvent avoir des valeurs différentes):

if(!set.add(obj)) {
    //set already contains the element (not the same object though) 
    set.remove(obj); //remove the one in  the set
    set.add(obj); //add the new one
}

Consultez la documentation de la méthode Set.add

Si cet ensemble contient déjà l'élément, l'appel le laisse inchangé et renvoie false.

0
Bhesh Gurung

Je travaillais sur un problème dans lequel j'avais un jeu, puis je voulais remplacer/remplacer certains objets par des objets d'un autre jeu.

Dans mon cas, j'ai fini par créer un nouvel ensemble et placer les remplacements en premier, puis en ajoutant les objets actuels. Cela fonctionne car un ensemble ne remplacera aucun objet existant lors de l'ajout de nouveaux objets.

Si tu as:

Set<WordInfo> currentInfo;
Set<WorldInfo> overrides;

Au lieu de:

for each override, replace the object in current info

J'ai fait:

Set<WordInfo> updated = new HashSet<>();
updated.addAll(overrides);
updated.addAll(currentInfo);
0
Cadell Christo