让我们考虑以下数组[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)
但是它有效,因为每个数组中的元素对于每个数组都是唯一的时间。
答案 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