Как использовать Scala Ordering # reverse с TreeMap? - PullRequest
3 голосов
/ 26 декабря 2010

У черты Ordering в Scala есть метод reverse, который кажется "официальным" способом получения TreeMap, который сортируется "неправильным" способом.

Фрагмент черты выглядит так:

trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable {
  outer =>

  override def reverse: Ordering[T] = new Ordering[T]{
    override def reverse = outer
    def compare(x: T, y: T) = outer.compare(y, x)
  }
  /*snip*/
}

Я думал, что это будет работать сравнимо с Collections.reverseOrder в Java, но Ordering.reverse, конечно, не работает.

Как я могу использовать обратный порядок с TreeMap, e. g.:

new TreeMap[Foo, Bar](/*???*/)

Ответы [ 3 ]

7 голосов
/ 26 декабря 2010
new TreeMap[Foo, Bar]()(implicitly[Ordering[Foo]].reverse)

Предполагая, конечно, что Ordering[Foo] неявно доступен (например, Ordering[Int] или Ordering[String]).Если оно определено как object X, просто передайте X.reverse.

Обратите внимание, что первый набор скобок здесь должен быть пустым - только второй набор скобок получает неявный параметрэто частный случай.

2 голосов
/ 10 апреля 2012
new TreeMap[Foo,Bar]()(Ordering[Foo].reverse)

тоже работает. Ницца! Сжато и без implicitly магии.

Что на самом деле здесь происходит, если я не ошибаюсь:

  • Odering[Foo] вызывает Ordering.apply, который имеет неявный параметр (который сам по себе имеет тип Ordering)
  • неявный def Ordering.ordered найден (я не уверен почему) для этого параметра и создает новый Ordering объект
  • что Ordering объект передается и возвращается Ordering.apply
  • reverse вызывается для этого Ordering объекта и создает еще один новый Ordering объект

Здесь я смешиваю жаргон и язык компиляции, но вы поймёте мой дрейф.

1 голос
/ 30 марта 2012

new TreeMap[Foo,Bar]()(Ordering.ordered[Foo].reverse) должно работать, если для Ordering[Foo] нет объекта, если Foo extends Ordered[Foo] (или, в более общем случае, Foo extends Comparable[Foo]).

...