如何将函数应用于Scala中的多维数组的每个元组?

时间:2010-10-12 07:46:39

标签: scala tuples

我有一个二维数组,我想将一个函数应用于数组中的每个值。

以下是我正在使用的内容:

scala> val array = Array.tabulate(2,2)((x,y) => (0,0))
array: Array[Array[(Int, Int)]] = Array(Array((0,0), (0,0)), Array((0,0), (0,0)))

我正在使用foreach来提取元组:

scala> array.foreach(i => i.foreach(j => println(i)))           
[Lscala.Tuple2;@11d559a
[Lscala.Tuple2;@11d559a
[Lscala.Tuple2;@df11d5
[Lscala.Tuple2;@df11d5

让我们做一个简单的功能:

//Takes two ints and return a Tuple2. Not sure this is the best approach.
scala> def foo(i: Int, j: Int):Tuple2[Int,Int] = (i+1,j+2)        
foo: (i: Int,j: Int)(Int, Int)

这样运行,但需要应用于数组(如果是可变的)或返回新数组。

scala> array.foreach(i => i.foreach(j => foo(j._1, j._2)))

不应该坏。我想错了一些基础知识......

2 个答案:

答案 0 :(得分:4)

(更新:删除了不正确的理解代码 - 它返回了一维数组)

def foo(t: (Int, Int)): (Int, Int) = (t._1 + 1, t._2 + 1)
array.map{_.map{foo}}

申请可变阵列

val array = ArrayBuffer.tabulate(2,2)((x,y) => (0,0))
for (sub <- array; 
     (cell, i) <- sub.zipWithIndex) 
  sub(i) = foo(cell._1, cell._2)

答案 1 :(得分:0)

2dArray.map(_.map(((_: Int).+(1) -> (_: Int).+(1)).tupled))

e.g。

scala> List[List[(Int, Int)]](List((1,3))).map(_.map(((_: Int).+(1) -> (_: Int).+(1)).tupled))
res123: List[List[(Int, Int)]] = List(List((2,4)))

强制要求点符号