我发现使用不可变列表的想法是成功的,但是当谈到这里的这段代码时,我被难住了。我发现自己写的东西更像Java而不是Scala风格。我宁愿使用List(...)
而不是Buffer(...)
,但我不知道如何将相同的修改不可变List
传递给下一个函数。guesses
在eliminate(...)
内也进行了修改。
如果有任何建议可以帮助我使Scala的方式做到这一点,我将不胜感激。由于
val randomGuesses = List(...) // some long list of random integers
val guesses = randomGuesses.zipWithIndex.toBuffer
for ( s <- loop()) {
val results = alphaSearch(guesses)
if (results.size == 1) {
guesses(resultes.head._2) = results.head._1
eliminate(guesses, resultes.head._2)
}
else {
val results = betaSearch(guesses)
if (results.size == 1) {
guesses(resultes.head._2) = results.head._1
eliminate(guesses, resultes.head._2)
} else {
val results = betaSearch(guesses)
if (results.size == 1) {
guesses(resultes.head._2) = results.head._1
eliminate(guesses, resultes.head._2)
}
}
}
}
这里有一些通用提示,因为这可能更适合codereview,并且所发布的代码不完整,没有示例。
您可以使用模式匹配代替if
和else
来检查大小
results.size match{
case 1 => ... //Code in the if block
case _ => ... //Code in the else block
}
创建一个新的List
,而不是改变guesses
。
val newGuesses = ...
将newGuesses
传递给eliminate
。
最后,看起来eliminate
修改了guesses
。将其更改为返回一个新列表。例如
def eliminate(list: List[Int]) = {
//Eliminate something from list and return a new `List`
}