"1", "b" -> "2", "c" -> "3") -6ren">
gpt4 book ai didi

scala - 如何修改foreach循环中的变量?

转载 作者:行者123 更新时间:2023-12-02 17:38:18 25 4
gpt4 key购买 nike

我有一个包含以下示例内容的 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
}

该方法应将在 text 中找到的所有 key 替换为其在 replacements 中分配的值。

问题是 foreach 循环中的命令 text = text.replace(key, replacements(key))

所以我的问题是:如何修改foreach循环中的变量text

最佳答案

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 正是迭代集合并构建或更新累积值的功能模式。它接受一个初始值和一个从前一个值和当前项到下一个值的函数,并返回最终值。 leftright 变体只是指您是将序列向后折叠还是向前折叠,这可能会在性能和结果方面产生差异,具体取决于您的数据您传递的函数的结构和性质。

另请参阅:http://www.scala-lang.org/api/2.11.1/index.html#scala.collection.Seq

关于scala - 如何修改foreach循环中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24058011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com