簡體   English   中英

合並Hashmaps保留值JAVA

[英]Merge Hashmaps retaining values JAVA

假設我有兩個哈希圖:

  1. {dog = 1,cat = 1,sport = 3,golf = 4}
  2. {dog = 5,person = 1,animal = 4}

我想合並它們保留值,以便值在輸出中相加

輸出:

{ dog = 6 ,person = 1,animal = 4,cat = 1,sport = 3,golf = 4}

注意“dog”的值是6 (5 + 1)

使用Hashmap.putAll(),dog的值變為5,任何想法如何合並這些保留值?

非常感謝,菲利普

Google的開源Guava Library有一個名為Multiset的類,它完全抽象出需要Map<T,Integer>來計算T實例。

您會發現使用Multiset<String>而不是使用Map<String,Integer>將導致更少的代碼,這些代碼不易出錯。

使用Multiset ,將兩者合並,你只會說:

multiset1.addAll(multiset2);
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));
   }
} 

把它扔在一起 - 不是說這是最好的方式。

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

如果你把一個重復的鍵,值放入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); 

這將是最簡單的非破壞性方法,盡管它可能不如兩個循環有效,因為兩個鍵集都插入到第三個。

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);
}

要縮短循環,你可以。

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));
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM