2013-05-01 88 views
0

我发现使用不可变List的想法成功,但是当来到这片代码在这里我难倒。我发现自己已经写了比Java更多的Java而不是Scala风格。我宁愿用List(...)代替Buffer(...)但我不知道怎样才能通过相同的修改不可改变List到下一个功能。 guesses也在eliminate(...)之内进行了修改。斯卡拉方式/成语

任何建议,以帮助我做这个做这个的斯卡拉方式表示赞赏。由于

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) 
      } 
     } 
    } 
} 

回答

1

这里有一些一般性的提示,因为这可能是更适合codereview和发布的代码是不完整的,没有样品。

您可以使用模式匹配,而不是ifelse检查大小。

results.size match{ 
    case 1 => ... //Code in the if block 
    case _ => ... //Code in the else block 
} 

相反变异guesses创建一个新的List的。

val newGuesses = ... 

然后传递到newGuesseseliminate

最后,它看起来像eliminate修改guesses。改变这个返回一个新的列表。例如

def eliminate(list: List[Int]) = { 
//Eliminate something from list and return a new `List` 
} 
+2

对于模式匹配的情况,更好的办法是尝试'结果匹配{case x :: Nil => //代码在if块中。我认为匹配列表本身的结构比检查大小更清晰,它使您能够立即访问列表的(单个)元素。 – 2013-05-01 16:33:23

+0

匹配不能解决我的多重嵌套的if-s,并且从elminate创建一个新的List不起作用,因为我将在for循环中再次使用猜测。对不起,我错过了for循环,我已经修改我的代码,以反映 – thlim 2013-05-01 17:42:35

+0

您可以使用替代'如果-else'语句与'match',然后重构。您可以使用递归而不是使用for循环。从'removed'中返回一个新的'List',并用新的列表调用你的函数。 – Brian 2013-05-01 18:13:15