Scala TreeMap estranheza; implementação de uma ordenação-ordem inversa
-
11-09-2019 - |
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)
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