在Groovy中合并两个包含列表的映射
我正在努力解决以下任务: 有两个包含列表的地图:在Groovy中合并两个包含列表的映射,groovy,Groovy,我正在努力解决以下任务: 有两个包含列表的地图: def m1 = [ k1: [ l1: ['s1', 's2']]] def m2 = [ k1: [ l1: ['s3', 's4']]] 因此,我想有一个单一的地图与列表添加在一起 assert merge(m1, m2) == [ k1: [ l1: ['s1', 's2', 's3', 's4']]] 实际上,地图要大得多,但想法是一样的。有人能帮忙吗?这里有一些我用过的东西。我们使用它两次:第一次查找m2中存在的需要合并的子映射。
def m1 = [ k1: [ l1: ['s1', 's2']]]
def m2 = [ k1: [ l1: ['s3', 's4']]]
因此,我想有一个单一的地图与列表添加在一起
assert merge(m1, m2) == [ k1: [ l1: ['s1', 's2', 's3', 's4']]]
实际上,地图要大得多,但想法是一样的。有人能帮忙吗?这里有一些我用过的东西。我们使用它两次:第一次查找
m2
中存在的需要合并的子映射。第二次查找需要组合的列表值
def m1 = [ k1: [ l1: ['s1', 's2']], k2: [l2: ['s5', 's6']]] // include entry not in m2
def m2 = [ k1: [ l1: ['s3', 's4']]]
/* Assumes that the maps contain values that support the + operator */
def combineListMaps = { map1, map2 ->
map1.collectEntries { key, list ->
def list2 = map2[key] ?: []
[key, list + list2]
}
}
m1.collectEntries { key, listMap ->
def listMap2 = m2[key]
if (listMap2)
[key, combineListMaps(listMap, listMap2)]
else
[key, listMap]
}
在groovy console中进行了10分钟的实验,产生了以下代码:
def m1 = [ k1: [ l1: ['s1', 's2']]]
def m2 = [ k1: [ l1: ['s3', 's4']]]
def accumulator = [:].withDefault{ [:].withDefault{ [] } }
Closure merger
merger = { Map trg, Map m ->
m.each{ k, v ->
switch( v ){
case Map: merger trg[ k ], v; break
case List: trg[ k ].addAll v; break
}
}
}
[ m1, m2 ].each merger.curry( accumulator )
assert [ k1: [ l1: ['s1', 's2', 's3', 's4']]] == accumulator
关键点是固定的,或者可以是任何关键点?关键点是相同的,但map2只能包含map1中的几个关键点。嵌套始终相同。或的可能重复