我有Map以下示例内容:
var replacements: Map[String, String] = Map("a" -> "1", "b" -> "2", "c" -> "3")
Run Code Online (Sandbox Code Playgroud)
以及以下方法:
def censor(text: String, replacements: Map[String, String]): String = {
replacements.keys.foreach(key => text = text.replace(key, replacements(key)))
return text
}
Run Code Online (Sandbox Code Playgroud)
该方法应该用其赋值的值替换所有key找到的s .textreplacements
问题是循环text = text.replace(key, replacements(key))内的命令foreach.
所以我的问题是:如何修改循环text内的变量foreach?
小智 5
foreach实际上并不是完成你想要的东西的正确工具.它不起作用的原因是方法参数不是变量,而是scala中的不可变值.你可以使用a var,但这不是Scala中的首选方式.相反,您可以折叠替换并将原始文本作为起始值:
def censor(text: String, replacements: Map[String, String]): String = {
replacements.foldLeft(text){ case (text, (key, replacement)) => text.replace(key, replacement)}
}
Run Code Online (Sandbox Code Playgroud)
或者是较短的版本:
def censor(text: String, replacements: Map[String, String]): String = {
replacements.foldLeft(text)((t, r) => t.replace(r._1, r._2))
}
Run Code Online (Sandbox Code Playgroud)
为了解释,如果你不熟悉,fold是准确收集和建筑物或者你去更新一个累积值的迭代的功能格局.它从前一个值和当前项获取初始值和函数到下一个值,并返回最终值.这些left和right变体只是指你是否向后或向前折叠你的序列,这可能会在性能和结果方面产生差异,这取决于你的数据结构和你传递的函数的性质.
另见:http://www.scala-lang.org/api/2.11.1/index.html#scala.collection.Seq
| 归档时间: |
|
| 查看次数: |
2849 次 |
| 最近记录: |