我试图解决下面的问题:
编写一个名为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问题,但我不知道为什么我仍然得到错误。
有人能解释一下为什么会出现这个错误,以及如何修复我的代码吗?
1条答案
按热度按时间erhoui1w1#
这里的错误与null无关。错误是说map需要
MutableList
作为它的值,但是你在map[character] =
之后写的表达式是:这里的
+
操作符产生List
,而不是可变的。您可以通过调用
toMutableList
从List
创建一个新的可变列表:但这是完全不必要的,因为
map[character] ?: mutableListOf<String>()
已经是一个可变列表了。为什么不加进去呢?要做到这一点,请使用
getOrPut
:这将尝试获取
map[character]
。如果它存在,add(dialogue)
。否则,将一个新列表放入Map中,如mutableListOf()
所创建的。也是add(dialogue)
。请注意,您可以通过使用
groupByTo
以更声明的方式完成此操作: