Groovy: сортировать ключи хеша по значению значения

Я хочу отсортировать хэш 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 ответ

Решение

Краткий ответ: да, 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 "s 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 гиперссылок. К сожалению, как новичку в Stackru, мне просто разрешено опубликовать один, и мне нужно удалить большинство ссылок... Извините.

Другие вопросы по тегам