如何对Array [Array [Int]]进行排序,假设内部数组具有相同的大小但我们不知道它

时间:2017-05-14 08:35:15

标签: scala sorting

让我们考虑以下数组[Array [Int]

val array = Array(Array(7,3,2,1), Array(3,2,5,1), Array(2,1,4,6), Array(1,2,3,4))

我想有这个结果

val sortedArray = Array(Array(1,2,3,4), Array(1,2,3,5), Array(1,2,3,7), Array(1,2,4,6))

如果我们知道每个内部数组的大小相同,我们就开始对每个内部数组进行排序,然后使用sortBy

val sortedArray = array.map(_.sorted).sortBy(x => (x(0), x(1), x(2), x(3)))

不幸的是,如果我们事先不知道内部阵列的大小,或者它是否巨大,我们就无法按照上面的说法进行操作。 也许可以动态地定义自定义排序..

在这种情况下我也可以

val sortedArray = array.map(_.sorted).map(a => (a.reduce(_+_), a)).sortBy(_._1).map(_._2)

但是它有效,因为每个数组中的元素对于每个数组都是唯一的时间。

1 个答案:

答案 0 :(得分:3)

您可以为数组元素实现自己的Ordering,如:

val array = Array(Array(7,3,2,1), Array(3,2,5,1), Array(2,1,4,6), Array(1,2,3,4))

implicit object IntArrayOrdering extends Ordering[Array[Int]] {
  override def compare(x: Array[Int], y: Array[Int]): Int =
    compareStream(x.toStream, y.toStream)

  private def compareStream(x: Stream[Int], y: Stream[Int]): Int = {
    (x.headOption, y.headOption) match {
      case (Some(xh), Some(yh))  => 
        if (xh == yh) {
          compareStream(x.tail, y.tail)
        } else {
          xh.compare(yh)
        }
      case (Some(_), None) => 1
      case (None, Some(_)) => -1
      case (None, None) => 0
    }
  }
}

array.map(_.sorted).sorted