kotlin 错误:类型不匹配:推断的类型为List< String>,但应为MutableList< String>

n53p2ov0  于 2023-05-01  发布在  Kotlin
关注(0)|答案(1)|浏览(454)

我试图解决下面的问题:
编写一个名为parseScript的方法,它接受一个String并返回一个Map<String, MutableList<String>>。传递的String包含一个脚本,由换行符分隔的行组成,每行的格式如下:

Name: Line

例如,这里有一个简单的脚本:

Geoffrey: What do you think of this homework problem?
Ahmed: it's a bit sus
Geoffrey: I bet they'll be able to figure it out!
Maaheen: We'll be here to help if they need it.

parseScript解析脚本并返回一个Map,该Map按顺序将每个字符的名称Map到它们的行。因此,对于上面的脚本,Map将包含三个键:“杰弗里”“艾哈迈德”和“玛辛”关键字“Geoffrey”的List<String>将包含字符串“What do you think of this homework problem!我打赌他们一定能想出办法来!关键字“Ahmed”的List<String>将包含字符串“it's a bit sus”。
我的尝试是:

fun parseScript(script: String): Map<String, MutableList<String>> {
    var map = mutableMapOf<String, MutableList<String>>()
    for (line in script.lines()) {
        var parts = line.split(":")
        var character = parts[0].trim()
        var dialogue = parts[1].trim()
        map[character] = (map[character] ?: mutableListOf<String>()) + dialogue
    }
    return map
}

这会产生错误:

Type mismatch: inferred type is List<String> but MutableList<String> was expected

在线

map[character] = (map[character] ?: mutableListOf<String>()) + dialogue

根据我的理解,elvis操作符应该处理null问题,但我不知道为什么我仍然得到错误。
有人能解释一下为什么会出现这个错误,以及如何修复我的代码吗?

erhoui1w

erhoui1w1#

这里的错误与null无关。错误是说map需要MutableList作为它的值,但是你在map[character] =之后写的表达式是:

(map[character] ?: mutableListOf<String>()) + dialogue

这里的+操作符产生List,而不是可变的。
您可以通过调用toMutableListList创建一个新的可变列表:

((map[character] ?: mutableListOf<String>()) + dialogue).toMutableList()

但这是完全不必要的,因为map[character] ?: mutableListOf<String>()已经是一个可变列表了。为什么不加进去呢?
要做到这一点,请使用getOrPut

map.getOrPut(character, ::mutableListOf).add(dialogue)

这将尝试获取map[character]。如果它存在,add(dialogue)。否则,将一个新列表放入Map中,如mutableListOf()所创建的。也是add(dialogue)
请注意,您可以通过使用groupByTo以更声明的方式完成此操作:

fun parseScript(script: String): Map<String, MutableList<String>> =
    script.lines().map { 
        it.split(":")
    }.groupByTo(
        mutableMapOf(), 
        keySelector = { it[0].trim() },
        valueTransform = { it[1].trim() }
    )

相关问题