gpt4 book ai didi

Kotlin:可变列表的可变映射不会更新列表

转载 作者:行者123 更新时间:2023-12-05 08:24:53 25 4
gpt4 key购买 nike

(这里是 Kotlin 新手)我有一个文本文件,其中的行如下所示:

1-1-1
1-1-2
1-1-3
2-1-1
2-1-2
etc.

我必须将这些数据转换为一个映射,其中键是前 2 个元素,值是与键匹配的第三个元素的列表。例如,上面的记录将转换成这个 JSON:

1-1: [1, 2, 3]
2-1: [1, 2]
etc.

我无法增加列表。这是一个简化版本,我卡在了“else”上:

fun main () {
val l1 = mutableListOf("1-1-1", "1-1-2", "1-1-3", "2-1-1", "2-1-2")
val m = mutableMapOf<String, List<Int>>()
for (e in l1) {
val c = e.split("-")
val key = "${c[0]}-${c[1]}"
if (m[key] == null) m[key] = listOf(c[2].toInt())
else println("How do I append to the list?")
}
println(m)
}

输出:

{1-1=[1], 2-1=[1]}

但是我想要:

{1-1=[1, 2, 3], 2-1=[1, 2]}

谢谢(欢迎对惯用形式发表评论!)

最佳答案

如果我们继续遵循您的策略,您需要的是将值类型设为 MutableList。然后,当该键已经存在列表时,您可以添加到现有的 MutableList 中:

fun main() {
val l1 = mutableListOf("1-1-1", "1-1-2", "1-1-3", "2-1-1", "2-1-2")
val m = mutableMapOf<String, MutableList<Int>>()
for (e in l1) {
val c = e.split("-")
val key = "${c[0]}-${c[1]}"
if (m[key] == null) m[key] = mutableListOf(c[2].toInt())
else m[key]!!.add(c[2].toInt())
}
println(m)
}

使用 getOrPut() 会更自然。它返回现有的 MutableList 或创建一个并在缺少时将其放入 map 中。这样我们就不必处​​理 if/else,只需将新项添加到列表即可。

fun main() {
val l1 = mutableListOf("1-1-1", "1-1-2", "1-1-3", "2-1-1", "2-1-2")
val m = mutableMapOf<String, MutableList<Int>>()
for (e in l1) {
val c = e.split("-")
val key = "${c[0]}-${c[1]}"
m.getOrPut(key, ::mutableListOf).add(c[2].toInt())
}
println(m)
}

但是我们可以使用mapgroupBy函数来更简单地创建它:

val m = l1.map { it.split("-") }
.groupBy(
{ "${it[0]}-${it[1]}" }, // keys
{ it[2].toInt() } // values
)

关于Kotlin:可变列表的可变映射不会更新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70230204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com