在二维数组中找到"列式"最大值

Pek*_*kka 2 arrays scala

假设我有一个二维数组,例如:

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)其他一些改进方法?

Mar*_*rth 6

使用.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)