我有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
循环内修改变量?
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句