Groovy: сортировать ключи хеша по значению значения - PullRequest
2 голосов
/ 24 октября 2010

Я хочу отсортировать хэш key-> value по значениям и получить список отсортированных ключей.

Это похоже на работу:

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]

но это всегда будет работать? Я не знаю, будет ли итератор, который строит keySet (), всегда повторять их по порядку.

Спасибо!

1 Ответ

8 голосов
/ 24 октября 2010

Краткий ответ : Да, метод keySet() всегда возвращает заказанный java.util.List.

Длинный ответ : Это немного сложно доказать, так как нам нужно взглянуть на некоторый исходный код.

Экзамен начинается в groovy.runtime.DefaultGroovyMethods, где метод public static <K, V> Map<K, V> sort(Map<K, V> self, Closure closure) возвращает java.util.LinkedHashMap, то есть упорядоченный .

Метод LinkedHashMap Set<K> keySet() определен в классе java.util.HashMap и возвращает Iterator, вызывая метод Iterator<K> newKeyIterator(), который переопределяется в классе LinkedHashMap] [4]. Он возвращает LinkedHashMap$KeyIterator, который [определяет метод K next(), который внутренне вызывает метод Entry<K,V> nextEntry(), который возвращает Entry, который был определен в поле LinkedHashMap$Entry.after.

Наконец, в методе LinkedHashMap$Entry.addBefore(Entry<K,V> existingEntry) можно увидеть, что поле LinkedHashMap$Entry.after установлено в порядке упорядоченный .


О, боже ... Я связал каждое сделанное мной заявление с соответствующим исходным кодом в groovy.runtime.DefaultGroovyMethods, java.util.HashMap и java.util.LinkedHashMap, суммируя до 10 гиперссылок. К сожалению, как новичку в Stackoverflow, мне просто разрешено опубликовать один, при этом необходимо удалить большинство ссылок ... Извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...