给定2D数组,例如
val in = Array( Array(10,11,12),
Array(20,21,22))
想要从第二个元素开始,每行中每个元素乘以10,每行中的第一个元素保持不变;示例中的期望结果将是
val out = Array( Array(10,110,120),
Array(20,210,220))
非常感谢。
答案 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))