J'ai deux HashMap
objets définis comme ceci:
HashMap<String, Integer> map1 = new HashMap<String, Integer>();
HashMap<String, Integer> map2 = new HashMap<String, Integer>();
J'ai aussi un troisième HashMap
objet:
HashMap<String, Integer> map3;
Comment puis-je fusionner map1
et map2
ensemble map3
?
Réponses:
la source
Map
sont par définition uniquesSi vous savez que vous n'avez pas de clés en double ou que vous souhaitez que les valeurs
map2
écrasent les valeurs desmap1
clés en double, vous pouvez simplement écrireSi vous avez besoin de plus de contrôle sur la façon dont les valeurs sont combinées, vous pouvez utiliser
Map.merge
, ajouté dans Java 8, qui utilise un fourni par l'utilisateurBiFunction
pour fusionner les valeurs des clés en double.merge
fonctionne sur des clés et des valeurs individuelles, vous devrez donc utiliser une boucle ouMap.forEach
. Ici, nous concaténons des chaînes pour les clés en double:Si vous savez que vous n'avez pas de clés en double et que vous souhaitez les appliquer, vous pouvez utiliser une fonction de fusion qui lance un
AssertionError
:Prendre un pas en arrière de cette question spécifique, les flux de Java 8 bibliothèque offre
toMap
etgroupingBy
collectionneurs . Si vous fusionnez à plusieurs reprises des cartes dans une boucle, vous pourrez peut-être restructurer votre calcul pour utiliser des flux, ce qui peut à la fois clarifier votre code et permettre un parallélisme facile en utilisant un flux parallèle et un collecteur simultané.la source
One-liner utilisant Java 8 Stream API:
Parmi les avantages de cette méthode, il y a la possibilité de passer une fonction de fusion, qui traitera des valeurs qui ont la même clé, par exemple:
la source
Java 8 alternatif one-liner pour fusionner deux cartes:
La même chose avec la référence de méthode:
Ou idemponent pour une solution de cartes originale avec une troisième carte:
Et voici un moyen de fusionner deux cartes en une carte immuable rapide avec Guava qui effectue le moins d'opérations de copie intermédiaire possibles:
Voir aussi Fusionner deux cartes avec Java 8 pour les cas où les valeurs présentes dans les deux cartes doivent être combinées avec la fonction de cartographie.
la source
Si vous n'avez pas besoin de mutabilité pour votre carte finale, il y a celle de Guava
ImmutableMap
avec sa méthodeBuilder
et qui, contrairement à la méthode d'interface de Java , peut être enchaînée.putAll
Map
Exemple d'utilisation:
Bien sûr, cette méthode peut être plus générique, utiliser des varargs et des boucles à
putAll
Maps
partir d'arguments, etc. mais je voulais montrer un concept.De plus,
ImmutableMap
et sesBuilder
limites sont limitées (ou peut-être des fonctionnalités?):NullPointerException
- si une clé ou une valeur dans la carte est nulle)IllegalArgumentException
si des clés en double ont été ajoutées).la source
HashMap a une
putAll
méthode.http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
la source
Vous pouvez utiliser Collection.addAll () pour d' autres types, par exemple
List
,Set
etc. PourMap
, vous pouvez utiliserputAll
.la source
Solution générique pour combiner deux cartes pouvant éventuellement partager des clés communes:
En place:
Retour d'une nouvelle carte:
la source
Un petit extrait que j'utilise très souvent pour créer une carte à partir d'autres cartes:
la source
vous pouvez utiliser
HashMap<String, List<Integer>>
pour fusionner les deux hashmaps et éviter de perdre des éléments associés à la même clé.production:
la source
Très tard mais permettez-moi de partager ce que j'ai fait quand j'ai eu le même problème.
Il donne la sortie suivante
la source
Les éléments en double ne seront pas ajoutés (c'est-à-dire les clés en double) car lorsque nous imprimerons hs3, nous n'obtiendrons qu'une seule valeur pour la clé 5 qui sera la dernière valeur ajoutée et ce sera rat. ** [L'ensemble a la propriété de ne pas autoriser la clé en double mais les valeurs peuvent être en double]
la source
Méthode 1: mettre des cartes dans une liste, puis rejoindre
Méthode 2: fusion normale de carte
la source
Vous pouvez utiliser la fonction putAll pour Map comme expliqué dans le code ci-dessous
la source
L'extrait ci-dessous prend plus d'une carte et les combine.
Exemple de lien de démonstration .
la source
vous pouvez utiliser - méthode addAll
http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
Mais il y a toujours ce problème qui - si vos deux cartes de hachage ont la même clé - alors il remplacera la valeur de la clé de la première carte de hachage par la valeur de la clé de la deuxième carte de hachage.
Pour être plus sûr - modifiez les valeurs de clé - vous pouvez utiliser un préfixe ou un suffixe sur les clés - (préfixe / suffixe différent pour la première carte de hachage et préfixe / suffixe différent pour la deuxième carte de hachage)
la source