4

I've got a two dimensional array and I want to apply a function to each value in the array.

Here's what I'm working with:

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)))

I'm using foreach to extract the tuples:

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

Let's make a simple function:

//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)

This runs, but need to apply to array(if mutable) or return new array.

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

Shouldn't be to bad. I'm missing some basics I think...

2 Answers 2

4

(UPDATE: removed the for comprehension code which was not correct - it returned a one dimensional array)

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

To apply to a mutable array

val array = ArrayBuffer.tabulate(2,2)((x,y) => (0,0))
for (sub <- array; 
     (cell, i) <- sub.zipWithIndex) 
  sub(i) = foo(cell._1, cell._2)
Sign up to request clarification or add additional context in comments.

1 Comment

Given that the for comprehensions corresponds to flatMap/map, either it or the following example is incorrect.
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)))

Dot notation required to force

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.