我正在尝试使用以下代码将反向排序传递给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
,因此它会抱怨额外的参数。如果使用Int
、Double
或Float
,则需要指定类型参数,如此处所述。总结一下:
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)