如何把所有的Java哈希映射的内容都放到另一个,但不能replace现有的键和值?
我需要将所有键和值从一个HashMap复制到另一个B,但不能replace现有的键和值。
最好的办法是做什么?
我在想,而不是迭代keySet,并检查它是否存在,我会的
Map temp = new HashMap(); // generic later temp.putAll(Amap); A.clear(); A.putAll(Bmap); A.putAll(temp);
看起来你愿意创build一个临时Map
,所以我会这样做:
Map tmp = new HashMap(patch); tmp.keySet().removeAll(target.keySet()); target.putAll(tmp);
在这里, patch
是您要添加到target
地图的地图。
感谢Louis Wasserman,这是一个利用Java 8中新方法的版本:
patch.forEach(target::putIfAbsent);
使用Guava的Maps类的效用方法来计算2个地图的差异,你可以用一行代码来完成,使用一个方法签名使得它更加清楚你想要完成什么:
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()); }
只需迭代并添加:
for(Map.Entry e : a.entrySet()) if(!b.containsKey(e.getKey()) b.put(e.getKey(), e.getValue());
编辑添加:
如果你可以修改一个,你也可以这样做:
a.putAll(b)
和一个将有你所需要的。 ( b
所有条目和b
所有条目都不在b
)
用Java 8有这个API方法来完成你的要求。
map.putIfAbsent(key, value)
如果指定键尚未与值关联(或映射为null),则将其与给定值关联并返回null,否则返回当前值。
如果您在@ erickson的解决scheme中更改地图顺序,您可以只用1行:
mapWithNotSoImportantValues.putAll( mapWithImportantValues );
在这种情况下,使用相同的键将mapWithNotSoImportantValues中的值replace为mapWithImportantValues中的值。
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); }}