2017-05-08 55 views
1

我在查找簡單優雅的方式將Java Comparator轉換爲scala Ordering將Java比較器轉換爲Scala Ordering

使用案例:

我有我想用Java代碼中定義一個比較排序Scala的集合:

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

回答

2

有讀取Ÿ在標準庫的隱式轉換:scala.math.Ordering.comparatorToOrdering

你只需要導入使用它:

import scala.math.Ordering.comparatorToOrdering 

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

如果我沒有記錯的話,在Ordering伴侶包含一個隱含的從比較[A]到訂購[A]的轉換:

您可以導入scala.math.Ordering.Implicits以獲取對其他隱含它的順序。

例子:

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 
+1

更重要的還有隱含'Ordering.comparatorToOrdering'方法,所以你不必讓@Harper自己做,只需導入它。請參閱http://www.scala-lang.org/api/2.12.0/scala/math/Ordering$.html#comparatorToOrdering[A](implicitcmp:java.util.Comparator[A]):scala.math.Ordering [一個] – SergGr

1

到目前爲止,我已經找到了最好的方法是定義自己的隱含了java.util.Comparator之間和訂貨

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

導入這個和轉換,那麼你可以寫

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