合并两个Map <string,list>

时间:2016-11-25 13:05:38

标签: java collections java-8

我有两个HashMaps,其中key是String,value是ArrayList。我需要合并这两个地图,如果 -

  1. 如果密钥不存在,则应使用给定的值映射密钥。
  2. 如果key已存在,我希望现有值与新值合并,即existingList.addAll(newList)。
  3. 初始代码有点像 -

    用于所有地图检查键

    user_about_me

    我不关心这里的重复元素。这样做有干净的方法吗?我已经阅读了Java 8中引入的合并方法。但由于这里的值是List类型,我正在寻找一种更有效,更干净的方法。

3 个答案:

答案 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