Сортировать несвязанные сопоставимые в Scala - PullRequest
4 голосов
/ 04 ноября 2011

Я немного знаком с сортировкой в ​​Scala с использованием Ordering, однако я бы хотел отсортировать некоторые объекты, определенные в 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?

1 Ответ

8 голосов
/ 04 ноября 2011

Ordering (в отличие от Ordered) отдельно от сравниваемого типа.Это эквивалентно java Comparator, а не Comparable.Таким образом, вы просто определяете свой порядок на Условиях как одноэлементный, нет проблем с наследованием Term.

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

Лучше пометить его неявным, так как будет удобно иметь его в неявном объеме.Тогда вам просто нужно убедиться, что TermOdering импортируется, когда вы вызываете какую-то операцию, которая нуждается в этом.

PS Вам следует прочитать этот замечательный ответ Даниэля Собрала.

...