在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中的几个关键点。嵌套始终相同。或的可能重复