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, мне просто разрешено опубликовать один, и мне нужно удалить большинство ссылок... Извините.