加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中对未绑定的可比较进行排序

发布时间:2020-12-16 18:07:39 所属栏目:安全 来源:网络整理
导读:我对使用Ordering的 Scala中的排序有些熟悉,但是我想对一些用 Java定义的对象进行排序.它们是可比较的(不可比较[T])和最终: final class Term implements Comparable { ... } (这实际上是Lucene的Term类,不,我不能改变Lucene的版本). 我首先希望有一个隐含
我对使用Ordering的 Scala中的排序有些熟悉,但是我想对一些用 Java定义的对象进行排序.它们是可比较的(不可比较[T])和最终:

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对象可能会出现这种情况?

解决方法

订购(与订购相反)与比较类型分开.它等同于java Comparator,而不是Comparable.因此,您只需定义将术语作为单例进行排序,继承Term就没有问题.

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

更好地将其标记为隐式,因为将它放在隐式范围中会很方便.然后,您必须确保在调用某些需要它的操作时导入TermOdering.

附:你应该读Daniel Sobral写的这个伟大的answer.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读