简体   繁体   English

将Java比较器转换为Scala排序

[英]Convert Java Comparator to Scala Ordering

I'm looking for a simple and elegant way to convert Java Comparator to scala Ordering . 我正在寻找一种将Java Comparator转换为scala Ordering的简单且优雅的方法。

Use case: 用例:

I have a Scala collection that I want to sort using a comparator defined in Java code: 我有一个Scala集合,我想使用Java代码中定义的比较器进行排序:

val comparator = getComparator()
val collection = Seq("a","b")
collection.sorted(???)

If I am not mistaken, the Ordering companion contains an implicit conversion from Comparable[A] to Ordering[A]: 如果我没记错的话, 订购伙伴会包含从Comparable [A]到Ordering [A]的隐式转换:

You can import scala.math.Ordering.Implicits to gain access to other implicit orderings. 您可以导入scala.math.Ordering.Implicits来访问其他隐式排序。

Example: 例:

import java.util.Date

val dateOrdering = implicitly[Ordering[Date]]
import dateOrdering._

val now = new Date
val later = new Date(now.getTime + 1000L)

now < later ... should be true

There is already an implicit conversion in the standard library: scala.math.Ordering.comparatorToOrdering 标准库中已经存在隐式转换: scala.math.Ordering.comparatorToOrdering

You just need an import to use it: 您只需要导入即可使用它:

import scala.math.Ordering.comparatorToOrdering

val comparator = getComparator()
val collection = Seq("a","b")
collection.sorted(comparator)

The best way I have found so far is to define your own implicit conversion between java.util.Comparator and Ordering 到目前为止,我发现的最好方法是在java.util.Comparator和Ordering之间定义自己的隐式转换

implicit def comparatorToOrdering[T](comparator: Comparator[T]) = 
new Ordering[T] {
     def compare(x: T, y: T): Int = comparator.compare(x, y)
}

Import this and then you can write 导入此,然后您可以编写

val comparator = getComparator()
val collection = Seq("a","b")
collection.sorted(comparator)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM