web-dev-qa-db-fra.com

Comment mettreAll on Java hashMap le contenu de l'un à l'autre, sans remplacer les clés et les valeurs existantes?

Je dois copier toutes les clés et les valeurs d'un HashMap A sur un autre B, mais pas pour remplacer les clés et les valeurs existantes.

Quel est le meilleur moyen de le faire?

Je pensais à la place itérer le keySet et vérifier si il existe ou non, je voudrais

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

On dirait que vous êtes prêt à créer un Map temporaire, alors je le ferais comme ceci:

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

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

Grâce à Louis Wasserman, voici une version qui tire parti des nouvelles méthodes de Java 8:

patch.forEach(target::putIfAbsent);
102
erickson

En utilisant les méthodes de Guava de Maps 'class' pour calculer la différence de 2 cartes, vous pouvez le faire en une seule ligne, avec une signature de méthode qui rend plus clair essaient 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());
}
15
Tom Tresansky

Il suffit de 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 modifier un élément, vous pouvez également effectuer les opérations suivantes:

a.putAll(b)

et a aura 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)

8
Reverend Gonzo

Vous pouvez le créer en une seule ligne si vous modifiez l'ordre des cartes dans la solution de @ erickson:

mapWithNotSoImportantValues.putAll( mapWithImportantValues );

Dans ce cas, vous remplacez les valeurs de mapWithNotSoImportantValues ​​par la valeur de mapWithImportantValues ​​avec les mêmes clés.

5
Anatolii Stepaniuk

Avec Java 8), cette méthode d’API répond à vos besoins.

map.putIfAbsent(key, value)

Si la clé spécifiée n'est pas déjà associée à une valeur (ou est mappée sur null), l'associe à la valeur donnée et renvoie la valeur null, sinon renvoie la valeur actuelle.

2
newday
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);
}}
2
Jajikanth pydimarla