Groovy:按值值排序哈希键

Yos*_*ale 2 sorting hash 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]
Run Code Online (Sandbox Code Playgroud)

但它会一直有效吗?我不知道构建keySet()的迭代器是否总是按顺序迭代它们.

谢谢!

rob*_*ert 9

简答:是的,该keySet()方法将始终返回一个有序的 java.util.List.

答案很长:这有点难以证明,因为我们必须查看一些源代码.

检查从方法返回的groovy.runtime.DefaultGroovyMethods位置开始,这是有序的.public static <K, V> Map<K, V> sort(Map<K, V> self, Closure closure)java.util.LinkedHashMap

所述LinkedHashMapSet<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.HashMapjava.util.LinkedHashMap总结了10个超链接.不幸的是,作为Stackoverflow的新手,我只允许发布一个,不得不删除大多数链接...抱歉.