Java:合并两个哈希映射?

时间:2018-05-22 05:10:57

标签: java hashmap

我试图实现自己的合并功能,但它变得越来越复杂并且出现越来越多的错误。我想也许Java已经有了这个功能,因为它似乎是一个常见的开发问题。

想象一下,我有两个HashMaps<String, int>

 HM1.put(foo,1)
 HM1.put(bar,1)

 HM2.put(foo,1)
 HM2.put(main,1)

当他们合并时,新的HM2将是这样的:

 [foo: 2]
 [bar, 1]
 [main,1]

6 个答案:

答案 0 :(得分:1)

您可以遍历第二张地图并动态更新HM1:

HM2.entrySet()
   .forEach(entry -> HM1.compute(
            entry.getKey(),
            (key, value) -> value == null ? 
                            entry.getValue() : 
                            entry.getValue() + value));

修改
更好地使用.merge(由this comment中的词典建议),这可以避免对不存在的键执行不必要的计算函数运行:

HM2.entrySet()
   .forEach(entry -> HM1.merge(
            entry.getKey(),
            entry.getValue(),
            (key, value) -> entry.getValue()   + value));

上述任何一项都会更新HM1以获得最终结果。

System.out.println(HM1);

Outpus:

{bar=1, foo=2, main=1}

答案 1 :(得分:1)

这是一个基于流/收集器的解决方案。它将地图转换为条目流,连接它们然后收集到地图中,使用输入键作为键并将值汇总为int s。

    Map<String, Integer> HM1 = new HashMap<>();
    Map<String, Integer> HM2 = new HashMap<>();
    HM1.put("foo", 1);
    HM1.put("bar", 1);

    HM2.put("foo", 1);
    HM2.put("main", 1);

    Map<String, Integer> result = Stream
        .concat(HM1.entrySet().stream(), HM2.entrySet().stream())
        .collect(
                Collectors.groupingBy(
                        Map.Entry::getKey,
                        Collectors.summingInt(Map.Entry::getValue)));

答案 2 :(得分:0)

希望,这会对你有所帮助

Set<String> keySet=hashMap1.keySet();

for(String str: keySet){
    int value=hashMap1.get(str);
    if(hashMap2.containsKey(str)){
        hashMap2.put(str, hashMap2.get(str)+value);
    }
    else{
        hashMap2.put(str, value);
    }
}

答案 3 :(得分:0)

上面使用的

Map.merge()是错误的。重映射功能应该有

(oldvalue, newvalue) -> oldvalue + newvalue

有趣的是,原始作者将他实施的2 * 1误认为1 + 1。嘿,结果就是我想要的,对吧?经验教训,1不是一个很好的测试值。

答案 4 :(得分:0)

另一种实现此目的的方法是使用toMap Collector,它被定义为具有合并功能:

var hm1 = new HashMap<String, Integer>();
hm1.put("foo",1);
hm1.put("bar",2);
var hm2 = new HashMap<String, Integer>();
hm2.put("foo",4);
hm2.put("baz",8);
var v = Stream.of(hm1, hm2)
    .map(Map::entrySet)
    .flatMap(Set::stream)
    .collect(
        Collectors.toMap(
            Map.Entry::getKey,   // key mapper
            Map.Entry::getValue, // value mapper
            Integer::sum         // merge function
        )
    );
System.out.println(v);

输出:

  

{bar = 2,foo = 5,baz = 8}

答案 5 :(得分:0)

HM1.forEach((k, v) -> HM2.merge(k, v, (key, value) -> v + value));