Groovy:如何通过属性将映射列表合并到单个映射,将不同的映射值合并到内部列表中

Groovy:如何通过属性将映射列表合并到单个映射,将不同的映射值合并到内部列表中,groovy,Groovy,我想将一个映射列表(实际上是一个带有jeft join多对多关系表的查询的结果列表)合并到一个映射,该映射将包含一个键:值对(如果它们在所有映射中相等)和键:[值列表],以防某个键的值不同。例如,拥有地图列表: [ [name:john, title:senior, access:floor1], [name:john, title:senior, access:floor2] ] def input = [ [name:'john', title:'senior',

我想将一个映射列表(实际上是一个带有jeft join多对多关系表的查询的结果列表)合并到一个映射,该映射将包含一个键:值对(如果它们在所有映射中相等)和键:[值列表],以防某个键的值不同。例如,拥有地图列表:

[  
[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
?这正是我要查找的内容(除了记录已经按名称分组,但仍然如此)。让我查一下……非常感谢你,蒂姆!正是我需要的!别担心,玩得开心!