web-dev-qa-db-fra.com

java.lang.UnsupportedOperationException lors de la combinaison de deux ensembles

J'ai 2 instances différentes de HashMap

Je veux fusionner les jeux de clés des deux HashMaps;

Code:

Set<String> mySet = hashMap1.keySet();
mySet.addAll(hashMap2.keySet());

Exception:

Java.lang.UnsupportedOperationException
    at Java.util.AbstractCollection.add(AbstractCollection.Java:238)
    at Java.util.AbstractCollection.addAll(AbstractCollection.Java:322)

Je ne reçois pas d'avertissement ou d'erreur de compilation.

De Java doc cela devrait fonctionner. Même si la collection ajoutée est également un ensemble:

booléen addAll (Collection c)

Ajoute tous les éléments de la collection spécifiée à cet ensemble s'ils ne sont pas déjà présents (opération facultative). Si la collection spécifiée est également un ensemble, l'opération addAll modifie efficacement cet ensemble afin que sa valeur soit l'union des deux ensembles. Le comportement de cette opération n'est pas défini si la collection spécifiée est modifiée pendant que l'opération est en cours.

33
user1236048

Si vous regardez les documents de la méthode HashMap#keySet() , vous obtiendrez votre réponse (c'est moi qui souligne).

Renvoie une vue d'ensemble des clés contenues dans cette carte. L'ensemble est soutenu par la carte, donc les modifications apportées à la carte sont reflétées dans l'ensemble, et vice-versa. Si la mappe est modifiée pendant qu'une itération sur l'ensemble est en cours (sauf via la propre opération de suppression de l'itérateur), les résultats de l'itération ne sont pas définis. L'ensemble prend en charge la suppression d'élément, ce qui supprime le mappage correspondant de la carte, via les opérations Iterator.remove, Set.remove, removeAll, retentionAll et clear. Il ne prend pas en charge les opérations add ou addAll.

Par conséquent, vous devez créer un nouvel ensemble et y ajouter tous les éléments, au lieu d'ajouter les éléments à la Set renvoyée par la keySet().

45
SudoRahul

Le résultat de keySet() ne prend pas en charge l'ajout d'éléments.

Si vous n'essayez pas de modifier hashMap1 mais je veux juste un ensemble contenant l'union des clés des deux cartes, essayez:

Set<String> mySet = new HashSet<String>();
mySet.addAll(hashMap1.keySet());
mySet.addAll(hashMap2.keySet());
26
NPE

Ne prend pas en charge par nature Set qui provient de map.keySet (). Il prend uniquement en charge les opérations de suppression, de suppression de tous, de conservation de tous et d'effacement.

Veuillez lire documentation

1
VinayVeluri

Toutes les réponses ci-dessus sont correctes. Si vous voulez toujours connaître le détail de l'implémentation (jdk 8)

hashMap1.keySet() returns a KeySet<E> et

KeySet<E>   extends AbstractSet<E>
AbstractSet<E> extends AbstractCollection<E> 

Dans AbstractCollection,

public boolean add(E e) {
        throw new UnsupportedOperationException();
    }

addAll() calls add() et c'est pourquoi vous obtenez un UOException

0
nantitv