Отличный способ преобразования карты ключ-> значения в значение-> ключи - PullRequest
1 голос
/ 17 июня 2019

Я пытаюсь придумать способ сделать ключи из списка значений.

Например: у меня есть эта карта [ a: [1, 2], b: [1, 3, 4] ]

Я хотел бы преобразовать его в [ 1: [a, b], 2: [a], 3: [b], 4: [b] ]

В основном я прошу отличную версию Как преобразовать ключ / значение в карту .

Пока что мое решение немного излишне, потому что я собираю все значения и создаю новые пары ключ-значение:

def m = [ a: [1, 2], b: [1, 3, 4] ]
def transformed = m.collectMany { k, v -> v }.collectEntries { v -> [ v, [] ] }
m.collectMany { k, v -> v.collect { vi -> [ vi, k ] } }.each { v, k ->
  transformed[v] += k
}
transformed

Есть ли лучший способ добиться этого преобразования?

1 Ответ

3 голосов
/ 17 июня 2019

Вы можете сделать это так с inject и withDefault на пустой карте:

def m = [a: [1, 2], b: [1, 3, 4]]

m.inject([:].withDefault {[]}) { map, value ->
    value.value.each { map[it] << value.key }
    map
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...