我想按值对键 - >值的散列进行排序,并获取排序键的列表。
这似乎有效:
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()的迭代器是否总是按顺序迭代它们。
谢谢!
答案 0 :(得分:8)
简短回答:是的,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
的{{1}}方法在Set<K> keySet()
类中定义,并通过调用java.util.HashMap
方法返回Iterator
方法,该方法在Iterator<K> newKeyIterator()
课程] [4]。它返回LinkedHashMap
,[定义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.LinkedHashMap
中的相应源代码相关联,总计最多10个超链接。不幸的是,作为Stackoverflow的新手,我只允许发布一个,不得不删除大多数链接...抱歉。