我正在尝试使用以下代码将反向顺序传递给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。
答案 0 :(得分:3)
扩展Yuval Itzchakov的评论,以下是scala.util.Sorting.quickSort
的{{3}}:
def quickSort(a: Array[Int]): Unit = java.util.Arrays.sort(a)
向下几行,source code重载的快速排序定义为:
def quickSort[K: Ordering](a: Array[K]): Unit = {...
您的意思是使用后一种。但是,当您调用quickSort时,编译器会在其参数列表中选择第一个不接受Ordering
的编译器,因此会抱怨额外的参数。如another所述,如果您使用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)
答案 1 :(得分:1)
根据文档,使用Ordering的方法的签名为:
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)