2016-11-25 85 views
2

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

  1. 如果密钥不存在,密钥应映射给定的值。
  2. 如果密钥已经存在,我想要将现有值与新值合并,即existingList.addAll(newList)。

初始代码有点样子 -

在地图检查的所有键如果

if (map1.containsKey("key")){ 
List l = map1.get ("key"); 
l.addAll(map2.get("key")); 
} 
else{ 
map1.put(map2); 
} 

我不关心重复的元素在这里。有没有一种干净的方式来做到这一点?我已经阅读了关于在Java 8中引入的合并方法。但是因为这些值是List类型,所以我正在寻找更高效和干净的方式。

+3

我会建议只按照你描述的方式写它。然后,你可以随时重构它。 – f1sh

+2

你可以添加第一次尝试的代码吗?基于此,讨论清洁度和效率会更容易 – reto

+2

我不确定你的意思是“*我不在乎这里的重复元素*”。除此之外,'合并'似乎是要走的路,即'map2.forEach((k,v) - > map1.merge(k,v,(l1,l2) - > {l1.addAll(l2); return l1;}));' – Holger

回答

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

您的解决方案将是更可读,如果你切换从Map<String, ArrayList>guavaMultimap

然后合并可以putAll

multimap.putAll(secondMultimap); 
+0

对于Java的Maps,putAll()也是可能的,但如果一个键已经存在,putAll()将不会替换该值吗? – raghav

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

+0

不想拥有第三张地图,但需要合并另一张地图。谢谢,会尝试修改这个。 – raghav

+0

此外,嵌套for循环不会太好。 – raghav

+0

@raghav由于您有2个输入映射,所以外层循环正好迭代了两次。由于这些地图之间的键可能不同,因此您需要将两者合并。那么这怎么不是一个好主意? – f1sh