Pergunta

Eu tenho um Map[Long, String] que gostaria iterar na ordem das chaves descendente. A maneira que eu escolhi para fazer isso foi a seguinte:

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)

Eu realmente não estou certo que eu entendo por que isso não funcionou e só posso supor que eu fiz algum erro estúpido. É claro que as seguintes obras:

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)
Foi útil?

Solução

Tricky. Vamos execução que a classificação:

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

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

Nós, portanto, concluir que 3 <1 <2. Qual implora a pergunta de por que as seguintes obras:

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

Bem, vamos colocar alguns parênteses lá, para ter certeza de que sabemos o que estamos fazendo

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

Ok, a resposta, então, é claro. Você está invertendo o resultado de compare, e é por isso que ele funciona. É algo diferente do que você fez da primeira vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top