2013-12-08 72 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即可。 –