Groovy:按值值排序哈希键

时间:2010-10-24 15:14:52

标签: sorting hash groovy

我想按值对键 - >值的散列进行排序,并获取排序键的列表。

这似乎有效:

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 个答案:

答案 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.aftergroovy.runtime.DefaultGroovyMethodsjava.util.LinkedHashMap中的相应源代码相关联,总计最多10个超链接。不幸的是,作为Stackoverflow的新手,我只允许发布一个,不得不删除大多数链接...抱歉。