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