2009-12-01 3 views
1

J'ai un Map[Long, String] que je voudrais parcourir dans l'ordre décroissant des touches. La façon dont j'ai choisi de le faire est la suivante:Scala TreeMap étrangeté; mettre en œuvre une commande d'ordre inverse

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) 

Je ne suis pas sûr que je comprends pourquoi cela n'a pas fonctionné et ne peut que supposer que je l'ai fait une erreur stupide. Bien sûr, les travaux suivants:

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) 

Répondre

4

Tricky. Lançons que le tri:

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

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

Nous concluons donc que 3 2. Ce qui pose la question de savoir pourquoi les travaux suivants:

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

Eh bien, nous allons mettre un peu entre parenthèses là, à assurez-vous que nous savons ce que nous faisons

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

Ok, la réponse est donc claire. Vous inversez le résultat de compare, et c'est pourquoi cela fonctionne. C'est quelque chose de différent de ce que tu as fait la première fois.

+0

J'ai supposé que la vue était appliquée aux clés à la fois comme cible et comme paramètre de la comparaison (c'est-à-dire '(-3L) .compare (-1L)' –

Questions connexes