如何将排序传递给scala.util.Sorting.quickSort



我正在尝试使用以下代码将反向排序传递给scala.util.Sorting.quickSort

val a = Array(3, 5, 1, 2)
scala.util.Sorting.quickSort(a)(Ordering.Int.reverse)

这样说是行不通的:

错误:单位不采用参数

但是,这样的代码有效:

val a = Array(3, 5, 1, 2)
a.sorted(Ordering.Int.reverse)

我不明白为什么quickSort的例子不起作用?Ordering.Int.reverse产生Ordering[Int],根据文档,quickSort隐式接受它。

我正在运行 Scala 2.12.7。

扩展Yuval Itzchakov的评论,以下是scala.util.Sorting.quickSort的源代码:

def quickSort(a: Array[Int]): Unit = java.util.Arrays.sort(a)

往下几行,另一个重载的快速排序定义为:

def quickSort[K: Ordering](a: Array[K]): Unit = {...

你的意思是使用后者。但是,当您调用 quickSort 时,编译器会选择第一个不接受其参数列表中的Ordering,因此它会抱怨额外的参数。如果使用IntDoubleFloat,则需要指定类型参数,如此处所述。总结一下:

val a : Array[Int] = Array(3, 5, 1, 2)
val b = Array(3L, 5L, 1L, 2L)  //Longs do not have this problem!
scala.util.Sorting.quickSort[Int](a)(Ordering.Int.reverse)
scala.util.Sorting.quickSort(b)(Ordering.Long.reverse)
println(a.toList)
println(b.toList)
List(5, 3, 2, 1)
List(5, 3, 2, 1)

根据文档,使用 Sort 的方法的签名为:

def quickSort[K](a: Array[K])(implicit arg0: math.Ordering[K]): Unit

使用快速排序对数组 a 进行排序,对其元素使用排序。这 算法就地排序,因此除了 在比较过程中可能需要对单个元素进行框框。

试试这个:

scala> val a = Array(3, 5, 1, 2)
a: Array[Int] = Array(3, 5, 1, 2)
scala> scala.util.Sorting.quickSort(a)(Ordering.Int.reverse)
<console>:13: error: Unit does not take parameters
scala.util.Sorting.quickSort(a)(Ordering.Int.reverse)
^
scala> scala.util.Sorting.quickSort[Int](a)(Ordering[Int].reverse)
scala> a
res2: Array[Int] = Array(5, 3, 2, 1)

最新更新