假设我有一个二维数组,例如:
val A1 = Array(Array(4,0,0,0),Array(3),Array(3,4,40,1),Array(50,2))
Run Code Online (Sandbox Code Playgroud)
现在我希望每个位置都有最多的项目.
如果我以矩阵形式编写上面的数组,那么很明显我的意思是"列式"最大值:
4 0 0 0
3
3 4 40 1
50 2
----------
50 4 40 1 (result)
Run Code Online (Sandbox Code Playgroud)
所以这种情况下的答案是Array(50,4,40,1)
(空值将被忽略).
我可以这样做:
A1.foldLeft(A1.head)( (x1, x2) =>
x1.padTo(x2.length, Int.MinValue).zip(x2.padTo(x1.length,Int.MinValue)).
map { pair => pair._1 max pair._2 }
)
Run Code Online (Sandbox Code Playgroud)
但不知何故,对于像这样的简单事情来说,这感觉非常硬.所以我希望有一个更简单的方法来做到这一点.
也许有
1)有些功能直接这样做吗?
2)有一些方法可以"用默认值压缩":x1.padTo(x2.length, Int.MinValue).zip(x2.padTo(x1.length,Int.MinValue))
更好吗?
3)其他一些改进方法?
使用.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)
Run Code Online (Sandbox Code Playgroud)
编辑:
.tranpose
如果Array
稍后遇到的s 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))
Run Code Online (Sandbox Code Playgroud)
如果在您的情况下可能发生这种情况,您可以始终按内部数组长度(按降序排序)对外部数组进行排序:
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))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
152 次 |
最近记录: |