La réponse à cela a donc expliqué le problème que j'ai: hachst. retirer () et iterator.remove () ne fonctionne pas p>
Fondamentalement, une fois que j'ajoute quelque chose au hashset, si je modifie l'un de ses champs, l'ensemble échouera tous les tests d'égalité avec un ensemble contenant un objet avec les mêmes champs, car le code de hachage qu'il a été stocké était pour quand il a eu des champs différents définis. P>
Donc, comme cette réponse explique ce qui se passe, quelle serait une bonne solution de contournement pour que cela ait à la fois le caractère unique d'utiliser un ensemble et être capable de modifier les champs internes des objets dans l'ensemble? Ou est-ce juste pas possible? P>
5 Réponses :
Supprimer l'objet que vous souhaitez modifier à partir de l'ensemble, le modifier, puis le ajouter. Autant que je sache, il n'y a pas de mise en oeuvre de type Alternativement, si les champs ne sont pas utilisés em> utilisés pour déterminer l'identité, l'égalité ou l'emplacement (c'est-à-dire non utilisés dans standard code> qui peut faire face aux champs (utilisée dans les
HashCode () code> ou
comparèteo () code > la mise en œuvre) étant modifiée pendant qu'elle est stockée. p>
hashcode () code>,
comparète code> ou
égale () code>) alors il n'y a pas de problème. p>
Choisir votre réponse malgré le nombre de voix, car c'est essentiellement la même chose que AIX et cela est venu quelques secondes avant :) Merci. Je pense que je pourrais réévaluer en utilisant un ensemble dans ce cas.
Si les champs que vous modifiez ne font pas partie du test d'égalité, ils ne doivent pas non plus faire partie du calcul du code de hachage non plus. Dans ce cas, il n'y a pas de problème: vous pouvez simplement modifier ces champs. P>
Si les champs Si c'est ce dernier et que vous vous trouvez beaucoup de choses, vous voudrez peut-être visiter le choix de la structure de données pour le problème à la main. P>
Le seul moyen de contourner ce problème serait de ne pas avoir de méthode code> dépendant de tout champ mutable. Si des objets ont une identité et une existence indépendante des valeurs de ses champs, ceci est facile - utilisez
system.identityhashashcode () code>. Sinon, vous pouvez baser le
hashcode () code> sur un seul champ non mutable. S'il n'y en a pas un, alors je crains que vous n'ayez pas de chance. P>
Utilisez HASHMAP au lieu de hashset. Définir la clé comme quelque chose d'unique qui ne changera pas dans le temps. P>
Utilisez toute autre collection (peut-être une linkedlist code>) et recherchez uniquement l'unicité uniquement au moment de l'ajout, comme dans
public class MySetList<E> extends LinkedList<E> implements Set<E> {
private static final long serialVersionUID = 1L;
@Override
public boolean add(E e) {
return new HashSet<E>(this).add(e) ? super.add(e) : false;
}
}