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();
}
}
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.
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);
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.
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);