2011-11-04 21 views
4

我對使用Ordering的Scala進行排序有點熟悉,但是我想排序一些在Java中定義的對象。他們Comparable(不Comparable[T])和final對未綁定進行排序可比較的斯卡拉

final class Term implements Comparable { ... } 

(這實際上是Lucene的期限類,並沒有我不能改變的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對象這種情況可能很常見?

回答

8

Ordering(與Ordered相反)與比較類型是分開的。它相當於java Comparator,而不是Comparable。所以,你只是簡單地定義你作爲單身訂購條款,繼承Term沒有問題。

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

更好地標記它隱含的,因爲它可以方便地在隱式範圍內。然後,只需調用某個需要它的操作,就必須確保導入了TermOdering

P.S.你應該閱讀Daniel Sobral的偉大answer

+1

是的,你是完全正確的,我搞砸了OrderedTerm定義 - 我的意思是'有序'而不是'排序'。 我正在避免你的解決方案,因爲我認爲我不得不重新實現實際的排序方法,但我不: 隱式對象TermOrdering extends Ordering [Term] { def compare(t1:Term,t2:Term ):Int = t1.compareTo(t2) } – jpg

+0

啊,的確,我錯過了那一點。 –