sorting - Groovy:按值对哈希键进行排序

标签 sorting hash groovy

我想按 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 ,这是有序的

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.HashMap java.util.LinkedHashMap ,总计最多 10 个超链接。不幸的是,作为 Stackoverflow 的新手,我只被允许发布一个,不得不删除大多数链接......抱歉。

关于sorting - Groovy:按值对哈希键进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008815/

相关文章:

javascript - 按属性对对象数组进行排序(使用自定义顺序,而不是按字母顺序)

memory - Redis 哈希结构并没有像描述的那样提高内存效率

c - Node : Performance of Native Addon vs External Binary

groovy - Jenkins 使用 groovy 为作业添加权限

jenkins - 如何从 sh step 命令获取 curl 退出状态?

grails - JavaMail SMTPAddressFailedException:550 5.7.1无法中继……(Grails)

c++ - 归并排序中的栈溢出

javascript - 如何将第二次点击添加到按钮纯javascript

arrays - 排序结果数组

c++ - 快速访问哈希函数(不使用字符串对象)