7
votes

Comment supprimer un élément d'un ensemble?

null
java.lang.UnsupportedOperationException
        at java.util.Collections$UnmodifiableCollection.remove(Collections.java:1021)

0 commentaires

3 Réponses :


4
votes

Votre getter vous renvoie explicitement un UNDODIFIABLECollection , qui est un wrapper de trembles autour de définir s qui empêche la modification.

En d'autres termes, l'API vous dit "C'est ma collection, veuillez regarder mais ne touchez pas!"

Si vous souhaitez le modifier, vous devez le copier dans un nouvel ensemble. Il existe des constructeurs de copie pour hashset qui sont parfaits à cette fin.


0 commentaires

9
votes

Désolé, vous n'avez pas de chance: l'ensemble a été enveloppé avec Collections.Unmodifiablecollection , qui fait exactement cela: Faire la collection non modifiable. La seule chose que vous puissiez faire est de copier le contenu en un autre ensemble et de travailler avec cela.


4 commentaires

Et y a-t-il des utilitaires comme la collection.Copie de faire cela?


Par exemple. Définir Ensemble = nouveau hashset (exps);


@Landei est-ce le comportement de Java par défaut ou devons-nous explicitement l'envelopper avec des collections.unmodifiablecollection. Si tel est par défaut, savez-vous dans quelle version de Java a été ajoutée ce changement?


@Atri je pense que tu as mal de réponse. La fonction Itératrice de cette implémentation de l'ensemble particulier (l'exemple de code ne vous montre pas lequel, et il n'est pas non plus clair si cette mise en œuvre est modifiable) utilise une collection emballée et non modifiable sous les hottes, ce qui empêche le jeu d'origine. est changé via l'itérateur. Je ne sais pas ce que vous voulez réaliser, mais si un itérateur peut ou non changer la collection sous-jacente est totalement à la hauteur de la mise en œuvre.



0
votes

Vous avez déclaré votre définition comme « final », ce qui signifie qu'il ne peut pas être modifié. L'erreur que vous obtenez est normale.

Si vous souhaitez modifier le contenu de l'ensemble, supprimez «final».


3 commentaires

Cette réponse est fausse et devrait être supprimée.


Vous pouvez ajouter et supprimer des éléments d'une collection finale (ensemble, liste, etc.). Ce que vous ne pouvez pas faire est d'initialiser un nouvel ensemble dans la même variable.


Mais l'ensemble lui-même n'est pas vraiment "final". La variable (dans ce cas exps ) est définitive. Comment vous déclarez une variable n'a absolument aucun impact sur l'ensemble. C'est pourquoi c'est faux et devrait être supprimé. Mais c'est un débordement de pile là où vous êtes puni pour souligner que quelque chose ne va pas et doit être supprimé.