如何将订单传递给scala.util.Sorting.quickSort

时间:2018-10-25 06:45:43

标签: scala

我正在尝试使用以下代码将反向顺序传递给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。

2 个答案:

答案 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所述,如果您使用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)

答案 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)