Скала TreeMap странность; реализация заказа в обратном порядке - PullRequest
1 голос
/ 01 декабря 2009

У меня есть Map[Long, String], который я хотел бы перебрать в порядке убывания ключей. Способ, который я выбрал, был следующим:

var m: SortedMap[Long, String] = TreeMap.empty( (l: Long) => -l)
m ++= Map(2L -> "Hello", 1L -> "World", 3L -> "Chris")
println(m) //Map(3 -> Chris, 1 -> World, 2 -> Hello)

Я действительно не уверен, что понимаю, почему это не сработало, и могу только предположить, что совершил какую-то глупую ошибку. Конечно, следующие работы:

var m: SortedMap[Long, String] = TreeMap.empty( (l: Long) => new Ordered[Long] {
  def compare(a: Long) = -l.compare(a)
})
m ++= Map(2L -> "Hello", 1L -> "World", 3L -> "Chris")
println(m) //Map(3 -> Chris, 2 -> Hello, 1 -> World)

1 Ответ

4 голосов
/ 01 декабря 2009

Tricky. Давайте запустим эту сортировку:

scala> (-3L).compare(1L)
res13: Int = -1

scala> (-1L).compare(2L)
res14: Int = -1

Поэтому мы приходим к выводу, что 3 <1 <2. В связи с этим возникает вопрос: почему работает следующее: </p>

def compare(a: Long) = -l.compare(a)

Хорошо, давайте поставим некоторые скобки, чтобы убедиться, что мы знаем, что делаем

def compare(a: Long) = -(l.compare(a))

Хорошо, тогда ответ ясен. Вы инвертируете результат compare, и именно поэтому он работает. Это нечто отличное от того, что вы делали в первый раз.

...