我想按 value 对 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() 的迭代器是否总是按顺序迭代它们。
谢谢!
最佳答案
简短回答:是的,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 的新手,我只被允许发布一个,不得不删除大多数链接......抱歉。
关于sorting - Groovy:按值对哈希键进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008815/