2013-05-01 111 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