对第二个项目中的行进行Scala 2D数组操作

时间:2014-03-05 11:34:11

标签: arrays scala collections multidimensional-array

给定2D数组,例如

val in = Array( Array(10,11,12),
                Array(20,21,22))

想要从第二个元素开始,每行中每个元素乘以10,每行中的第一个元素保持不变;示例中的期望结果将是

val out = Array( Array(10,110,120),
                 Array(20,210,220))

非常感谢。

3 个答案:

答案 0 :(得分:3)

编辑:

val out = in.map {
  case Array(head, tail @ _*) => head +: tail.toArray.map(_ * 10)
  case _ => ...
}

更简单但有点不安全的解决方案:

val out = in.map(arr => arr.head +: arr.tail.map(_ * 10))

答案 1 :(得分:2)

val out = in.map(_.zipWithIndex.map {m => 
    { if (m._2==0) m._1 else m._1*10 }
} )

或者如果你不喜欢生成索引:

val out = in.map (m => (
    for {
        h <- m.headOption
    } yield h +:  m.tail.map(_ * 10)
) getOrElse Array())

(如果其中一个数组为空,则两种方法都是安全的)

答案 2 :(得分:1)

1)此代码可以抛出Exception:java.util.NoSuchElementException:如果其中一个数组将为空,则返回空迭代器

in.map(a => {a.head +: a.tail.map(_*10) })

2)在我看来更优选,但如果你的数组恰好有第一个元素,它们就不会成倍增加(Alexey Romanov评论)

in.map(a => a.map(t => if (a.indexOf(t)==0) t else t*10))

3)安全变体1)

in.map(a => a.take(1) ++ a.slice(1, a.length).map(_*10))