Слияние Hashmaps с сохранением значений JAVA - PullRequest
2 голосов
/ 27 августа 2010

Скажем, у меня есть два хеш-карты:

  1. {собака = 1, кошка = 1, спорт = 3, гольф = 4}
  2. {собака = 5, человек = 1, животное = 4}

Я хочу объединить их, сохранив значения, чтобы значения складывались вместе в выводе

Выход:

{ собака = 6 , человек = 1, животное = 4, кошка = 1, спорт = 3, гольф = 4}

Обратите внимание, что значение "собака" равно 6 (5 + 1)

Используя Hashmap.putAll (), значение dog становится равным 5, Есть идеи, как мне объединить их, сохранив значения?

Большое спасибо, Philip

Ответы [ 6 ]

6 голосов
/ 27 августа 2010

Google с открытым исходным кодом Библиотека Guava имеет класс Multiset, который полностью исключает необходимость в Map<T,Integer> для подсчета экземпляров T.

Вы обнаружите, что использование Multiset<String> вместо Map<String,Integer> приведет к меньшему количеству кода, который будет менее подвержен ошибкам, чтобы сделать то же самое.

Используя Multiset, чтобы объединить два, вы просто скажете:

multiset1.addAll(multiset2);
4 голосов
/ 27 августа 2010
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 голосов
/ 28 августа 2010

Сократить петли можно.

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));
} 
0 голосов
/ 27 августа 2010

Это был бы самый простой неразрушающий способ сделать это, хотя он может быть не столь эффективным, как два цикла, поскольку оба набора ключей вставляются в третий.

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 голосов
/ 27 августа 2010

Если вы поместите дубликат ключа, значение в карту в 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); 
0 голосов
/ 27 августа 2010

Возьмите большую и обведите меньшую, добавив несуществующие записи и изменив значение для существующих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...