说我有两个哈希图:
我想合并它们保留值,以便值在输出中加在一起
输出:
{ dog = 6 ,person = 1,animal = 4,cat = 1,sport = 3,golf = 4}
注意“dog”的值是否为6 (5 + 1)
使用Hashmap.putAll(),dog的值变为5,任何想法如何合并这些保留值?
非常感谢, 菲利普
答案 0 :(得分:6)
Google的开源Guava Library有一个名为Multiset
的类,它完全抽象出需要Map<T,Integer>
来计算T
的实例。
您会发现使用Multiset<String>
而不是使用Map<String,Integer>
会导致代码更少,而且更不容易出错。
使用Multiset
合并两个你只会说:
multiset1.addAll(multiset2);
答案 1 :(得分: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));
}
}
把它扔在一起 - 不是说这是最好的方式。
答案 2 :(得分:0)
取较大的一个,然后沿着较小的一个循环,添加不存在的条目,并调整现有条目的值。
答案 3 :(得分: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);
答案 4 :(得分:0)
这是最简单的非破坏性方法,尽管它可能不如两个循环有效,因为两个键集都插入到第3个。
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);
}
答案 5 :(得分: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));
}