2010-08-27 241 views
2

說我有兩個包含HashMap:合併包含HashMap保持值JAVA

  1. {狗= 1,貓= 1,運動= 3,高爾夫球= 4}
  2. {狗= 5,人= 1,動物= 4}

我要合併他們保留值,這樣的值在輸出加在一起

輸出:

{狗= 6,人= 1,動物= 4,貓= 1,運動= 3,高爾夫球= 4}

通知 「狗」 如何具有6 (5 + 1)的值

使用Hashmap.putAll(),狗的值變爲5,任何想法如何合併這些保留值?

非常感謝, 菲利普

回答

4
HashMap merged = new HashMap<String, Integer>(); 

for (String x : map1.getKeySet()) { 
    Integer y = map2.get(x); 
    if (y == null) { 
     merged.put(x, map1.get(x)); 
    } else { 
     merged.put(x, map1.get(x)+y); 
    } 
} 

for (String x : map2.getKeySet()) { 
    if (merged.get(x) == null) { 
     merged.put(x, map2.get(x)); 
    } 
} 

只是把它們一起 - 不是說這是最好的方式。

+0

+1,運行良好,謝謝隊友! – Venky 2012-03-07 11:32:46

0

取較大的一個,沿着較小的一個循環,添加不存在的條目,並調整現有值的值。

0

如果你把一個重複的鍵,在java中的值映射到一個地圖,它將取代之前的任何值。

你可以檢查,看看是否值存在 所以

Map outputMap = new HashMap<String, Integer>() 
for(Map.Entry<String, Integer> entry : map1.entrySet()){ 
    if(map2.contains(entry.getKey()){ 
    outputMap.put(entry.getKey(), entry.getValue() + map2.get(entry.getKey()); 
    map2.remove(entry.getKey()); 
    } 
    else 
    outputMap.put(entry.getKey(), entry.getValue() 
} 
outputMap.addAll(map2); 
6

谷歌的開源Guava Library有一個名爲Multiset類完全抽象出來計數T情況下需要一個Map<T,Integer>

你會發現使用Multiset<String>而不是使用Map<String,Integer>將會導致代碼少,而且錯誤發生的可能性更小。

使用Multiset,合併兩個你只是說:

multiset1.addAll(multiset2); 
+1

+1,'Multiset'完美適合這個問題! – 2010-08-27 14:06:25

+3

雖然一個很好的答案,添加一個第三方庫來做一個簡單的合併似乎有點矯枉過正 - 不是很多關於這個代碼是「容易出錯」 – Gandalf 2010-08-27 14:31:05

+0

@Gandalf:我同意你評論中的所有觀點。爲了記錄,我喜歡'Multiset'方法,不是因爲它不那麼「容易出錯」,而是因爲它看起來像是該作業的最佳數據結構。 :) – 2010-08-27 14:49:30

0

這將是這樣做的最簡單的非破壞性的方法雖然因爲兩個按鍵組插入到它可能不會像兩個循環高效第三名。

HashSet<String> allKeys = new HashSet<String>(); 
HashMap<String, Integer> resultMap = new HashMap<String, Integer>(); 
allKeys.addAll(map1.keySet()); 
allKeys.addAll(map2.keySet()); 
for (String k : allKeys) { 
    int i1 = map1.containsKey(k) ? map1.get(k) : 0; 
    int i2 = map2.containsKey(k) ? map2.get(k) : 0; 
    resultMap.put(k, i1 + i2); 
} 
0

爲了縮短循環,你可以。

Map<String, Integer> merged = new HashMap<String, Integer>(map1); 
for (Map.Entry<String, Integer> entry : map2.entrySet()) { 
    Integer y = merged.get(entry.getKey()); 
    merged.put(entry.getKey(), entry.getValue() + (y == null ? 0 : y)); 
}