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