2013-12-08 99 views
1

我有這兩個項目:更新一個列表[列表[INT]]與特定元素

1)grid:List[List[Int]其表示一個完整的數字表

2)x:List[(Int,Int, Int)]其中前兩個int爲行和列座標和最後一個特定位置必須更新的內容。

基本上,我需要使用列表x中的以下項目更新網格,而不使用循環或變量。

這是我到達現在的地方,但它不起作用。

def changeItem(x:(Int,Int,Int)) ={ 
     grid.apply(x._1).updated(x._2, x._3) 
} 
z.map(x => changeItem(x)) //z contains the list[(Int,Int,Int)] 

我在正確的軌道上嗎?

在此先感謝

+0

來自Sudoku求解器賦值的另一個問題?看到賦值 –

回答

3

的問題是,你不能使用map要做到這一點,因爲map根據x的事情,這大概會返回修改grid s的名單,每一個變化而變化grid 。相反,您希望x中的每件事都修改整個grid,以保留此修改的grid,並在更新的網格上執行下一個更改,等等。 map方法不能做到這一點,但foldLeft可以,因爲它將每個操作的結果轉發到下一個操作。

val grid = List(List(1,2,3),List(4,5,6),List(7,8,9)) 
val x = List((2,0,11),(1,2,12),(0,0,13)) 
x.foldLeft(grid) { case (z, (i,j,v)) => z.updated(i,grid(i).updated(j,v)) } 
// List[List[Int]] = List(List(13, 2, 3), List(4, 5, 12), List(11, 8, 9)) 

所以更新聲明說,與grid(i)更新的版本替換的gridi個元素(因爲我們必須把相同的列表早在修改後的地方),其中j個元素被替換v

+0

很酷很有趣,不知道你可以用FoldLeft做到這一點。我會試一試,非常感謝您的快速回復! :) – User49230

+0

或者如果你想更新網格,只需使用foreach即可。 –