我有这两个项目:
1)grid:List[List[Int]
代表一个满数字的表
2)x:List[(Int,Int, Int)]
其中前两个Ints是行和列坐标,最后一个是必须更新的具体位置。
基本上,我需要使用列表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 :(得分:3)
问题是,由于map
根据map
中的内容更改了grid
,因此您无法使用x
执行此操作,这可能会返回一个列表修改后的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
的{{1}}元素(因为我们必须在修改后将相同的列表放回原位)其中grid(i)
元素替换为j
。