在Scala中就地排序数组

时间:2016-03-04 05:15:38

标签: scala scala-collections scala-2.11 scala-generics

我试过了:

implicit class ArrayExtensions[A](a: Array[A]) {
  /**
   * Sort a slice [from, until) of this array
   */
  def sort(from: Int, until: Int)(implicit cmp: Ordering[A]) = java.util.Arrays.sort(a, from, until, cmp)
}

但是,我认为我正在点击a bug in the compiler

[error]  found   : Array[A]
[error]  required: Array[? with Object]
[error] Note: A >: ? with Object, but class Array is invariant in type T.
[error] You may wish to investigate a wildcard type such as `_ >: ? with Object`. (SLS 3.2.10)
[error]     def sort(from: Int, until: Int)(implicit cmp: Ordering[A]) = java.util.Arrays.sort(a, from, until, cmp)

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您的问题的答案就在您引用的错误中:" Java通用数组不能与Scala值类型一起使用"。正如bug所说,真正的问题是错误信息并没有太大帮助。问题是您对A的类型没有约束,但并非所有Scala类型都可以用作Java泛型类型参数,只有引用类型可以。试试这个:

implicit class ArrayExtensions[A <: AnyRef](a: Array[A]) {
    /**
     * Sort a slice [from, until) of this array
     */
    def sort(from: Int, until: Int)(implicit cmp: Ordering[A]) = java.util.Arrays.sort(a, from, until, cmp)
}

AnyRef对应Java Object,而Any包含非Java对象的Scala类型(如Int)。

答案 1 :(得分:1)

所以,到目前为止,我已经做到了这一点:

a.slice(from, until).sorted.copyToArray(a, from)

但是,这并不理想,因为它需要两次额外的遍历。