我有两个HashMaps,其中key是String,value是ArrayList。我需要合并这两个地图,如果 -
初始代码有点像 -
用于所有地图检查键
user_about_me
我不关心这里的重复元素。这样做有干净的方法吗?我已经阅读了Java 8中引入的合并方法。但由于这里的值是List类型,我正在寻找一种更有效,更干净的方法。
答案 0 :(得分:1)
希望此代码有所帮助。您应该迭代其中一个列表并添加或更新其他列表。
public static HashMap<String, ArrayList<Object>> merge(HashMap<String, ArrayList<Object>> list_1, HashMap<String, ArrayList<Object>> list_2) {
//Iterate second hash map
Iterator it = list_2.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next();
String key = (String) pair.getKey();
ArrayList<Object> value = (ArrayList<Object>) pair.getValue();
if(list_1.containsKey(key)){
//UPDATE
list_1.replace(key, value); //Replaces the entry for the specified key only if it is currently mapped to some value.
} else {
//ADD
list_1.put(key, value);
}
}
return list_1;
}
答案 1 :(得分:1)
如果您从Map<String, ArrayList>
切换到guava Multimap
然后可以使用putAll
multimap.putAll(secondMultimap);
答案 2 :(得分:0)
这是使用java8的Map.merge()
的方法//your two input maps
Map<String, List<String>> input1 = new HashMap<>();
Map<String, List<String>> input2 = new HashMap<>();
Map<String, List<String>>[] arrr = new Map[]{input1,input2};
Map<String, List<String>> merged = new HashMap<>();
for(Map<String, List<String>> input:arrr){
for(Entry<String, List<String>> e:input.entrySet()){
merged.merge(e.getKey(), e.getValue(), (v1,v2)->{v1.addAll(v2);return v1;});
}
}
这会创建一个Map实例作为输出(merged
)。我没有对此进行测试,所以我不确定merge
的内部运作是否会导致v1
在某个时刻null
。