【问题标题】:Groovy: sort hash keys by values valueGroovy:按值对哈希键进行排序
【发布时间】:2010-10-25 00:43:16
【问题描述】:

我想通过 values 对 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() 的迭代器是否总是按顺序迭代它们。

谢谢!

【问题讨论】:

    标签: sorting hash groovy


    【解决方案1】:

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

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

    检查从groovy.runtime.DefaultGroovyMethods 开始,其中public static &lt;K, V&gt; Map&lt;K, V&gt; sort(Map&lt;K, V&gt; self, Closure closure) 方法返回一个java.util.LinkedHashMap,这是有序

    LinkedHashMapSet&lt;K&gt; keySet() 方法在java.util.HashMap 类中定义,并通过调用Iterator&lt;K&gt; newKeyIterator() 方法返回Iterator,该方法在LinkedHashMap 类中被覆盖][4]。它返回一个LinkedHashMap$KeyIterator,它[定义了内部调用Entry&lt;K,V&gt; nextEntry()方法的K next()方法,该方法返回一个Entry,它已经在LinkedHashMap$Entry.after字段中定义。

    最后,在LinkedHashMap$Entry.addBefore(Entry&lt;K,V&gt; existingEntry) 方法中可以看到LinkedHashMap$Entry.after 字段是以有序的方式设置的。


    哦,天哪……我已将我所做的每条语句链接到groovy.runtime.DefaultGroovyMethodsjava.util.HashMapjava.util.LinkedHashMap 中的相应源代码,总共有 10 个超链接。不幸的是,作为 Stackoverflow 的新手,我只能发布一个,不得不删除大部分链接......对不起。

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多