我想将地图转换为列表
例如我有
mapOf("a" to listOf(1,2),
"b" to listOf(3,4)
)
我希望结果是
listOf("a", 1, 2, "b", 3, 4)
order必须是键及其值,键及其值,...
kotlin中有一些功能可以帮助我吗?
答案 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>
加上键和键值。
答案 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)
您可以在flatMap
上map.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
}