【问题标题】:Scala: reverse order of Sorting.quickSort?Scala:Sorting.quickSort 的逆序?
【发布时间】:2018-02-09 09:31:15
【问题描述】:

This answer 解释了如何在使用其内置方法.sortBy 时反转数组的排序顺序。使用scala.util.Sorting.quickSort时如何颠倒排序?

【问题讨论】:

  • 为什么不采用同样的方式?

标签: scala sorting


【解决方案1】:

像这样:

import scala.util.Sorting.quickSort

val a = Array(1, 2, 3)
quickSort[Int](a)(Ordering[Int].reverse)
//       ^---^ the most important bit
println(a.toVector) // Vector(3, 2, 1)

quickSort 是一个函数,它具有 IntFloatDouble 的重载,它不允许您指定排序,以及具有 Ordering 实例的任何类型 [T] 的通用函数.

如果你有一个 IntFloatDouble 的数组,重载解析将更喜欢专门的版本,所以你将无法手动传递 Ordering,除非你指定一个类型参数(所以现在编译只有一种选择)。

对于这三种类型以外的数组(例如Longs),您可以省略类型参数,因为只有一个有效选项:

val b = Array(1L, 2L, 3L)
quickSort(b)(Ordering[Long].reverse)
println(b.toVector) // Vector(3, 2, 1)

【讨论】:

    【解决方案2】:

    如果您查找quickSort 的类型签名,您应该会发现:

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

    显然这意味着您可以通过实现隐式Ordering[K](或传入一个)来自定义行为。

    例子:

    val a = Array(3, 4, 2, 3)
    quickSort[Int](a)(Ordering.Int.reverse)
    

    【讨论】:

    • 出于性能原因,您应该只使用就地排序;就地修改/更新值使得推理代码变得非常困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多