2010-10-24 11 views
2

Je veux trier un hachage de clé-> valeur par les valeurs, et obtenir la liste des clés triées.Groovy: trier les clés de hachage par valeurs valeur

Cela semble fonctionner:

groovy> def map = [a:5, b:3, c:6, d:4].sort { a, b -> a.value <=> b.value }.keySet() 
groovy> println map 

[b, d, a, c] 

mais il toujours? Je ne sais pas si l'itérateur qui construit le jeu de clés() va toujours les parcourir par ordre.

Merci!

Répondre

8

Réponse courte: Oui, la méthode keySet() renvoie toujours une ordonnéjava.util.List.

Réponse longue: C'est un peu difficile à prouver car nous devons regarder un code source.

examen commence à groovy.runtime.DefaultGroovyMethods lorsque la méthode public static <K, V> Map<K, V> sort(Map<K, V> self, Closure closure) renvoie un java.util.LinkedHashMap, qui est commandé .

La méthode de l » Set<K> keySet()LinkedHashMap est défini dans la classe java.util.HashMap et renvoie un Iterator en appelant la méthode Iterator<K> newKeyIterator(), qui est surchargée dans la classe LinkedHashMap] [4]. Il renvoie un LinkedHashMap$KeyIterator, qui [définit la méthode K next() qui appelle en interne la méthode Entry<K,V> nextEntry(), qui renvoie un Entry qui a été défini dans le champ LinkedHashMap$Entry.after.

Enfin, on peut voir dans la méthode LinkedHashMap$Entry.addBefore(Entry<K,V> existingEntry) que le champ LinkedHashMap$Entry.after est défini de manière ordonnée.


Oh mon ... Je reliaient chaque déclaration, je l'ai fait au code source correspondant à groovy.runtime.DefaultGroovyMethods, java.util.HashMap et java.util.LinkedHashMap, résumant jusqu'à 10 liens hypertextes. Malheureusement, en tant que débutant à Stackoverflow, je suis juste autorisé à poster un, avoir à supprimer la plupart des liens ... Désolé.

+0

WOW, bravo l'homme! – Yossale