Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中合并两个嵌套映射_Java_Hashmap_Java Stream_Collectors - Fatal编程技术网

在Java中合并两个嵌套映射

在Java中合并两个嵌套映射,java,hashmap,java-stream,collectors,Java,Hashmap,Java Stream,Collectors,我有两个嵌套贴图,我必须合并这两个贴图,这样如果键相同,那么它应该合并内部贴图,否则保持原样 Map<String, Map<String, int>> one = new HashMap<>(); Map<String, Map<String, int>> two = new HashMap<>(); one.put("a", someMap1) one.put("b", someMap2) two.put("a", s

我有两个嵌套贴图,我必须合并这两个贴图,这样如果键相同,那么它应该合并内部贴图,否则保持原样

Map<String, Map<String, int>> one = new HashMap<>();
Map<String, Map<String, int>> two = new HashMap<>();

one.put("a", someMap1)
one.put("b", someMap2)
two.put("a", someMap3)

resultant mergedMap = (("a", mergeMap(someMap1, someMap3), ("b", someMap2));
Map one=newhashmap();
Map two=新的HashMap();
一、放(“a”,someMap1)
一、放(“b”,someMap2)
2.放(“a”,someMap3)
结果mergedMap=((“a”,mergeMap(someMap1,someMap3),(“b”,someMap2));
如果键相同,这将合并映射值。我已经实现了mergeMap()方法。如何实现它?

这如何(完全未测试):

静态接口合并{
T合并(ta,tb);
}
静态类intmerge实现合并{
@凌驾
公共整数合并(整数a、整数b){
//TODO如何处理包含相同条目的两个内部映射?
}
}
静态类MapMerge实现合并{
私人最终合并;
地图合并(合并价值合并){
this.valuemerge=valuemerge;
}
@凌驾
公共地图合并(地图a、地图b){
映射结果=新的HashMap();
结果:putAll(a);
for(Entry-ent:b.entrySet()){
result.merge(key,val,(a,b)->valuemerge.merge(a,b))
}
}
}
公共静态地图合并地图(
mapA,
地图地图b){
返回new MapMerge(new MapMerge(new IntMerge())。merge(mapA,mapB);
}

您可以使用实用程序功能创建嵌套地图

private static <K, V> Map<K, V> innerMerge(K key, V val, BiFunction<V, V, V> function) {
    HashMap<K, V> map = new HashMap<>();
    map.merge(key, val, function);
    return map;
}
私有静态映射innerMerge(K键、V值、双功能函数){
HashMap=newHashMap();
map.merge(键、值、函数);
返回图;
}
范例

Map<Long, Map<Long, String>> groups = new HashMap<>();
groups.merge(groupId, innerMerge(innerGroupId, groupName, (v1, v2) -> v1), (v1, v2) -> {v1.putAll(v2); return v1;});
Map groups=newhashmap();
groups.merge(groupId,innerMerge(innerGroupId,groupName,(v1,v2)->v1),(v1,v2)->{v1.putAll(v2);返回v1;});
如果您想要下面这样的映射,请再次使用实用程序函数进行合并

Map<Long, Map<Long, Map<Long, String>>> groups = new HashMap<>();
// You could use utility function get multi level Map merge
groups.merge(groupId,
   innerMerge(innerGroupId,
      innerMerge(innerAnotherGroupId, groupName, 
      (v1, v2) -> v1 + "," + v2), 
   (v1, v2) -> {v1.putAll(v2); return v1;}),
(v1, v2) -> {v1.putAll(v2); return v1;});
Map groups=newhashmap();
//可以使用实用程序函数获取多级地图合并
groups.merge(groupId,
innerMerge(innerGroupId,
innerMerge(innerAnotherGroupId、groupName、,
(v1,v2)->v1+“,”+v2),
(v1,v2)->{v1.putAll(v2);返回v1;}),
(v1,v2)->{v1.putAll(v2);返回v1;});
注意:您应该定义自己的双函数来操作现有键的值


出于您的目的,如果您的map1和map2签名相同,您可以简单地使用
map1.putAll(map2)

Map
?您是否尝试过
Map.merge()
?是的,它是Map,而mergeMap(someMap1,someMap3)做的类似于Map-mapOne=new HashMap();mapOne.put('a',',);mapOne.put('b',',3);第二个映射:map mapTwo=new HashMap();mapTwo.put('a',5);mapTwo.put('b',6);mapTwo.put('c',4);结果映射=('a',7),('b',9),('c',4));集合中不能有原语……因此
map
在Java中不存在
Map<Long, Map<Long, Map<Long, String>>> groups = new HashMap<>();
// You could use utility function get multi level Map merge
groups.merge(groupId,
   innerMerge(innerGroupId,
      innerMerge(innerAnotherGroupId, groupName, 
      (v1, v2) -> v1 + "," + v2), 
   (v1, v2) -> {v1.putAll(v2); return v1;}),
(v1, v2) -> {v1.putAll(v2); return v1;});