使用.tranpose
獲得「列」你Array[Array[Int]]
的,然後調用.map(_.max)
讓所有的最大值:
scala> val A1 = Array(Array(4,0,0,0),Array(3),Array(3,4,40,1),Array(50,2))
A1: Array[Array[Int]] = Array(Array(4, 0, 0, 0), Array(3), Array(3, 4, 40, 1), Array(50, 2))
scala> A1.transpose
res5: Array[Array[Int]] = Array(Array(4, 3, 3, 50), Array(0, 4, 2), Array(0, 40), Array(0, 1))
scala> A1.transpose.map(_.max)
res6: Array[Int] = Array(50, 4, 40, 1)
編輯: .tranpose
可能拋出如有異常Array
在後面遇到的Array[Array[T]]
比第一個更長:
scala> Array(Array(1,2,3), Array(1,2,3,4)).transpose
java.lang.ArrayIndexOutOfBoundsException: 3
at scala.collection.mutable.ArrayOps$$anonfun$transpose$1$$anonfun$apply$1.apply(ArrayOps.scala:102)
at scala.collection.mutable.ArrayOps$$anonfun$transpose$1$$anonfun$apply$1.apply(ArrayOps.scala:101)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofInt.foreach(ArrayOps.scala:234)
at scala.collection.mutable.ArrayOps$$anonfun$transpose$1.apply(ArrayOps.scala:101)
at scala.collection.mutable.ArrayOps$$anonfun$transpose$1.apply(ArrayOps.scala:99)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
at scala.collection.mutable.ArrayOps$class.transpose(ArrayOps.scala:99)
at scala.collection.mutable.ArrayOps$ofRef.transpose(ArrayOps.scala:186)
... 32 elided
scala> Array(Array(1,2,3,4), Array(1,2,3)).transpose
res5: Array[Array[Int]] = Array(Array(1, 1), Array(2, 2), Array(3, 3), Array(4))
如果能在你的情況發生,你可以通過內部數組長度外陣列(按降序排列)總是排序:
scala> Array(Array(1,2,3), Array(1,2,3,4)).sortBy(-_.length).transpose
res6: Array[Array[Int]] = Array(Array(1, 1), Array(2, 2), Array(3, 3), Array(4))
不錯。我知道這樣簡單的事情會存在,但無法弄清楚。首先排序有點不幸。我懷疑Giovanni的答案會明顯更快......可能是錯誤的,雖然 – Pekka