我有Map
个以下示例内容:
var replacements: Map[String, String] = Map("a" -> "1", "b" -> "2", "c" -> "3")
和以下方法:
def censor(text: String, replacements: Map[String, String]): String = {
replacements.keys.foreach(key => text = text.replace(key, replacements(key)))
return text
}
该方法应将key
中找到的所有text
替换为replacements
中指定的值。
问题是text = text.replace(key, replacements(key))
循环中的命令foreach
。
所以我的问题是:如何修改text
循环中的变量foreach
?
答案 0 :(得分:5)
foreach
实际上不是完成你想要的工具。它不起作用的原因是方法参数不是变量,而是scala中的不可变值。您可以使用var
,但这不是Scala中的首选方式。相反,您可以折叠替换并将原始文本作为起始值:
def censor(text: String, replacements: Map[String, String]): String = {
replacements.foldLeft(text){ case (text, (key, replacement)) => text.replace(key, replacement)}
}
或者是较短的版本:
def censor(text: String, replacements: Map[String, String]): String = {
replacements.foldLeft(text)((t, r) => t.replace(r._1, r._2))
}
要解释一下,如果您不熟悉,fold
完全正在迭代集合并构建或更新累积值的功能模式。它从前一个值和当前项获取初始值和函数到下一个值,并返回最终值。 left
和right
变体只是指您是否向后或向前折叠序列,这可能会在性能和结果方面产生差异,具体取决于您的数据结构和数据结构的性质。你传递的功能。
另请参阅:http://www.scala-lang.org/api/2.11.1/index.html#scala.collection.Seq