89 votes

Comment mettreAll sur Java hashMap contenu de l'un à l'autre, mais pas remplacer les clés et les valeurs existantes ?

J'ai besoin de copier toutes les clés et valeurs d'une HashMap A sur une autre B, mais pas de remplacer les clés et valeurs existantes.

Quel est le meilleur moyen de le faire ?

Je pensais qu'au lieu d'itérer l'ensemble des clés et de vérifier si elles existent ou non, je pourrais

Map temp = new HashMap(); // generic later
temp.putAll(Amap);
A.clear();
A.putAll(Bmap);
A.putAll(temp);

114voto

erickson Points 127945

Il semble que vous êtes prêt à créer un temporaire Map alors je le ferais comme ça :

Map tmp = new HashMap(patch);
tmp.keySet().removeAll(target.keySet());
target.putAll(tmp);

Ici, patch est la carte que vous ajoutez à la target carte.

Merci à Louis Wasserman, Voici une version qui tire parti des nouvelles méthodes de Java 8 :

patch.forEach(target::putIfAbsent);

16voto

Tom Tresansky Points 5423

Utilisation de Goyave 's Cartes pour calculer la différence de deux cartes, vous pouvez le faire en une seule ligne, avec une signature de méthode qui rend plus clair ce que vous essayez d'accomplir :

public static void main(final String[] args) {
    // Create some maps
    final Map<Integer, String> map1 = new HashMap<Integer, String>();
    map1.put(1, "Hello");
    map1.put(2, "There");
    final Map<Integer, String> map2 = new HashMap<Integer, String>();
    map2.put(2, "There");
    map2.put(3, "is");
    map2.put(4, "a");
    map2.put(5, "bird");

    // Add everything in map1 not in map2 to map2
    map2.putAll(Maps.difference(map1, map2).entriesOnlyOnLeft());
}

8voto

Reverend Gonzo Points 15504

Il suffit d'itérer et d'ajouter :

for(Map.Entry e : a.entrySet())
  if(!b.containsKey(e.getKey())
    b.put(e.getKey(), e.getValue());

Modifier pour ajouter :

Si vous pouvez apporter des modifications à un, vous pouvez aussi le faire :

a.putAll(b)

et vous aurez exactement ce dont vous avez besoin. (toutes les entrées dans b et toutes les entrées dans a qui ne sont pas dans b )

6voto

Anatolii Stepaniuk Points 1563

Vous pouvez le faire en une seule ligne si vous changez l'ordre des cartes dans la solution de @erickson :

mapWithNotSoImportantValues.putAll( mapWithImportantValues );

Dans ce cas, vous remplacez les valeurs de mapWithNotSoImportantValues par des valeurs de mapWithImportantValues ayant les mêmes clés.

2voto

public class MyMap {

public static void main(String[] args) {

    Map<String, String> map1 = new HashMap<String, String>();
    map1.put("key1", "value1");
    map1.put("key2", "value2");
    map1.put("key3", "value3");
    map1.put(null, null);

    Map<String, String> map2 = new HashMap<String, String>();
    map2.put("key4", "value4");
    map2.put("key5", "value5");
    map2.put("key6", "value6");
    map2.put("key3", "replaced-value-of-key3-in-map2");
    // used only if map1 can be changes/updates with the same keys present in map2.
    map1.putAll(map2);

    // use below if you are not supposed to modify the map1.
    for (Map.Entry e : map2.entrySet())
        if (!map1.containsKey(e.getKey()))
            map1.put(e.getKey().toString(), e.getValue().toString());
    System.out.println(map1);
}}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X