Groovy:如何通过属性将映射列表合并到单个映射,将不同的映射值合并到内部列表中
我想将一个映射列表(实际上是一个带有jeft join多对多关系表的查询的结果列表)合并到一个映射,该映射将包含一个键:值对(如果它们在所有映射中相等)和键:[值列表],以防某个键的值不同。例如,拥有地图列表:Groovy:如何通过属性将映射列表合并到单个映射,将不同的映射值合并到内部列表中,groovy,Groovy,我想将一个映射列表(实际上是一个带有jeft join多对多关系表的查询的结果列表)合并到一个映射,该映射将包含一个键:值对(如果它们在所有映射中相等)和键:[值列表],以防某个键的值不同。例如,拥有地图列表: [ [name:john, title:senior, access:floor1], [name:john, title:senior, access:floor2] ] def input = [ [name:'john', title:'senior',
[
[name:john, title:senior, access:floor1],
[name:john, title:senior, access:floor2]
]
def input = [
[name:'john', title:'senior', access:'floor1'],
[name:'john', title:'senior', access:'floor2'],
[name:'carol', title:'senior', access:'floor2']
]
地图
[name:john, title:senior, access:[floor1, floor2]]
因此,给定一个地图输入列表:
[
[name:john, title:senior, access:floor1],
[name:john, title:senior, access:floor2]
]
def input = [
[name:'john', title:'senior', access:'floor1'],
[name:'john', title:'senior', access:'floor2'],
[name:'carol', title:'senior', access:'floor2']
]
我们可以按前两个分组(同样,作为地图):
这给了我们:
[
[name:john, title:senior]:[
[name:john, title:senior, access:floor1],
[name:john, title:senior, access:floor2]
],
[name:carol, title:senior]:[
[name:carol, title:senior, access:floor2]
]
]
然后,我们可以将它们收集到所需的输出形式中,为我们提供:
input.groupBy { [name: it.name, title: it.title] }.collect { k, v ->
k + [access: v.access]
}
结果如下:
[
[name:john, title:senior, access:[floor1, floor2]],
[name:carol, title:senior, access:[floor2]]
]
按照从左到右的谨慎顺序(因此名称实际上是主键)?ie:code>[姓名:'carol',头衔:'senior',访问权限:'floor1']发生了什么事?@tim_-yates从未发生过。所有内容都已按实际主键分组。除了“访问”之外,所有条目都是相等的,所以您需要分组的只是
access
?这正是我要查找的内容(除了记录已经按名称分组,但仍然如此)。让我查一下……非常感谢你,蒂姆!正是我需要的!别担心,玩得开心!