Котлин - из списка карт, в карту, сгруппированную по ключу - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть List<Map<Branch,Pair<String, Any>>>, который я хотел бы преобразовать в один Map<Branch,List<Pair<String, Any>>>.

Так что, если у меня есть начальный список с двумя элементами:

Список

1. branch1 -> Pair(key1,value1)

   branch2 -> Pair(key2,value2)


2. branch1 -> Pair(key1a,value1a)

Я хочу закончить с:

Map

branch1 -> Pair(key1,value1)

           Pair(key1a,value1a)

branch2 -> Pair(key2,value2)

так что это своего рода groupBy, использующий все значения ключей в изначально вложенных картах ..

Я пробовал с

list.groupBy{it-> it.keys.first()} 

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

Какой самый идиоматичный способ сделать это в Котлине?У меня есть ужасно выглядящая рабочая версия на Java, но я вполне уверен, что у Kotlin есть хороший способ сделать это ... просто я пока не нахожу ее!

Есть идеи?

Спасибо

Ответы [ 4 ]

0 голосов
/ 23 ноября 2018
val list: List<Map<Branch, Pair<String, Any>>> = listOf() 
val map = list
    .flatMap { it.entries }
    .groupBy { it.key }
    .mapValues { entry -> entry.value.map { it.value } }
0 голосов
/ 22 ноября 2018

Следующее:

val result =
    listOfMaps.asSequence()
        .flatMap {
          it.asSequence()
        }.groupBy({ it.key }, { it.value })

даст вам result типа Map<Branch,List<Pair<String, Any>>> с запрошенным вами содержимым.

0 голосов
/ 22 ноября 2018

Извлеките его в функцию расширения

private fun <K, V> List<Map<K, V>>.group(): Map<K, List<V>> =
        asSequence().flatMap { it.asSequence() }.groupBy({ it.key }, { it.value })

Используйте это так:

val list = yourListOfMaps
val grouped = list.group()
0 голосов
/ 22 ноября 2018

Мне удалось написать это.

data class Branch(val name: String)
data class Key(val name: String)
data class Value(val name: String)


val sharedBranch = Branch("1")
val listOfMaps: List<Map<Branch, Pair<Key, Value>>> = listOf(
        mapOf(sharedBranch to Pair(Key("1"), Value("1")),
                Branch("2") to Pair(Key("2"), Value("2"))),
        mapOf(sharedBranch to Pair(Key("1a"), Value("1a")))
)

val mapValues: Map<Branch, List<Pair<Key, Value>>> = listOfMaps.asSequence()
        .flatMap { map -> map.entries.asSequence() }
        .groupBy(Map.Entry<Branch, Pair<Key, Value>>::key)
        .mapValues { it.value.map(Map.Entry<Branch, Pair<Key, Value>>::value) }

println(mapValues)

Применимо ли это для ваших нужд?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...