Kotlin是否可以将Map <k out =“” t =“”,=“” list <v =“” out =“” t =“”>展平到List <t>

时间:2018-11-20 12:39:05

标签: kotlin

我想将地图转换为列表

例如我有

mapOf("a" to listOf(1,2),
      "b" to listOf(3,4)
)

我希望结果是

listOf("a", 1, 2, "b", 3, 4)

order必须是键及其值,键及其值,...

kotlin中有一些功能可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

我的第二个注释变体作为Map<String, List<Int>>的答案:

mapOf("a" to listOf(1,2),
      "b" to listOf(3,4))
     .flatMap { (key, values) -> listOf(key) + values }

这会给List<Any>加上键和键值。

此示例使用了destructuring declarationMap.flatMap

答案 1 :(得分:2)

更新:下面的答案是在更新问题和更改地图创建方式之前编写的(有关详细信息,请参阅问题的历史记录)。按照现在的问题,下面的答案将不再起作用。我相信,它确实可以解决最初提出的问题。

@Roland是正确的,因为您的地图永远不会出现在该列表中,因为针对任何给定键,地图中只能有一个值。因此,我认为您需要用成对列表替换该映射。然后,您可以将其分组并进行平面布置图以获得所需的结果:

val pairs = listOf("a" to 1, "a" to 2, "b" to 3, "b" to 4)
val result = pairs
        .groupBy { it.first }
        .flatMap { (key, values) -> listOf(key).plus(values.map { it.second }) }

您可能会决定更具可读性的另一个选项是:

val result = pairs
        .groupBy({ it.first }, { it.second })
        .flatMap { (key, values) -> listOf(key).plus(values) }

答案 2 :(得分:1)

您可以在flatMapmap.entries。看看这个function

val map = mapOf("a" to listOf(1,2), 
                "b" to listOf(3,4))
println(map)
val flattened : List<Any> = map.entries.flatMap {entry -> 
    //create list with key as only element, must be type <Any> to add other stuff later
    val list = mutableListOf<Any>(entry.key)
    //add values
    list.addAll(entry.value)
    list
}
println(flattened)

打印:

{a=[1, 2], b=[3, 4]}
[a, 1, 2, b, 3, 4]

@Rolands的答案启发了这个更简单,更惯用的版本。本质上是一样的,但是将所有内容都塞进一行:

 val flattened: List<Any> = map.flatMap {entry -> 
        listOf(entry.key) + entry.value
 }