Groovy: как объединить список карт в одну карту по свойству, объединяя различные значения карты во внутренние списки - PullRequest
0 голосов
/ 08 апреля 2020

Я хотел бы объединить список карт (который на самом деле является списком результатов запроса с таблицами отношений «многие ко многим» в jeft join) в одну карту, которая будет содержать одну пару ключ: значение, если они равны во всех картах и ​​ключе: [список значений], если значения различаются для определенного ключа. Например, наличие списка карт:

[  
[name:john, title:senior, access:floor1],  
[name:john, title:senior, access:floor2]  
]

на карту

[name:john, title:senior, access:[floor1, floor2]]

1 Ответ

1 голос
/ 08 апреля 2020

Таким образом, учитывая входной список карт:

def input = [  
    [name:'john', title:'senior', access:'floor1'],  
    [name:'john', title:'senior', access:'floor2'],  
    [name:'carol', title:'senior', access:'floor2']
]

Мы можем сгруппировать по первым двум (опять же, как карта):

input.groupBy { [name: it.name, title: it.title] }

Что дает нам:

[
    [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]]
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...