scala - 在 Scala 中对未绑定(bind)的 Comparable 进行排序

标签 scala comparable

我对在 Scala 中使用 Ordering 进行排序有点熟悉。的,但是我想对一些在 Java 中定义的对象进行排序。他们是 Comparable (不是 Comparable[T] )和 final :

final class Term implements Comparable { ... }

(这实际上是 Lucene 的 Term 类,不,我不能更改 Lucene 的版本)。

我首先希望在某个地方有一个隐含的:
terms.sorted //fail - no implicit ordering

所以也许我可以订购它?
class OrderedTerm extends Term with Ordering[Term] //fail - class is final

在此之后,我想我会求助于使用 java.util.Collections.sort :
Collections.sort(terms) // error: inferred type arguments [org.apache.lucene.index.Term] do not conform to method sort's type parameter bounds [T <: java.lang.Comparable[_ >: T]]

所以看起来即使这也不起作用,因为 Scala 对它的类型参数很严格。在这一点上,我可以看到两种方法:重新实现另一个显式排序(不好)或用 Java 编写排序(没那么坏)。

有没有办法在 Scala 中干净地做到这一点?我假设这种情况在使用遗留 Java 对象时可能很常见?

最佳答案

Ordering (相对于 Ordered )与比较类型是分开的。相当于java Comparator ,而不是 Comparable .因此,您只需将条款定义为单例,继承 Term 没有问题.

implicit object TermOrdering extends Ordering[Term] {
  def compare(t1: Term, t2: Term: Term): Int = ....
}

最好将其标记为隐式,因为将其置于隐式范围内会很方便。那么你只需要确保TermOdering当您调用一些需要它的操作时导入。

附言您应该阅读这篇精彩的 answer丹尼尔索布拉尔。

关于scala - 在 Scala 中对未绑定(bind)的 Comparable 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8006195/

相关文章:

exception - Scala:为什么此模式匹配代码会抛出 IndexOutOfBoundsException?

scala - 通过 SOCKS 代理连接到 spark

scala - 为什么Scala 中的这个函数调用没有被优化掉?

java - 我在 Java 中找不到这个compareTo(T) 函数的错误

java - Java 中的泛型

使用许多属性进行 Java 对象比较

java - Java/Scala 有没有好的 GnuPG 加密库?

scala - Spark 示例无法编译

java - 二进制搜索方法数组Java

java - 使用可比较的类保留 2D Arraylist 的原始索引