关于Kotlin:Kotlin-从地图列表到按键分组的地图

Kotlin - from a list of Maps, to a map grouped by key

我有一个List>>,我想转换为一个Map>>

因此,如果我有一个仅包含2个元素的初始列表:

清单

1
2
3
4
5
6
1. branch1 -> Pair(key1,value1)

   branch2 -> Pair(key2,value2)


2. branch1 -> Pair(key1a,value1a)

我要结束于:

地图

1
2
3
4
5
branch1 -> Pair(key1,value1)

           Pair(key1a,value1a)

branch2 -> Pair(key2,value2)

因此是一种groupBy,它使用了最初嵌套的映射中所有键的值。

我尝试过

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

但显然不起作用,因为它仅使用第一个密钥。 我想要相同的东西,但是将所有键用作单独的值。

在Kotlin中,最惯用的方式是什么? 我有一个看起来很丑的Java工作版本,但是我很确定Kotlin有一个很好的方法来做..只是到目前为止我还没有找到它!

任何的想法 ?

谢谢


1
2
3
4
5
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 } }

下列:

1
2
3
4
5
val result =
    listOfMaps.asSequence()
        .flatMap {
          it.asSequence()
        }.groupBy({ it.key }, { it.value })

将为您提供类型为Map>>result和您所请求的内容。


我设法写了这个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)

是否可以满足您的需求?


将其提取到扩展功能

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

像这样使用它:

1
2
val list = yourListOfMaps
val grouped = list.group()