2016-11-25 83 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