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