2010-10-24 99 views
2

我想按值排序key-> value的散列值,並獲取排序後的鍵列表。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()的迭代器是否總是按順序迭代它們。

謝謝!

回答

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,其有序

LinkedHashMapSet<K> keySet()方法在java.util.HashMap類中定義並通過調用Iterator<K> newKeyIterator()方法,它是在LinkedHashMap類重寫返回Iterator] [4]。它返回一個LinkedHashMap$KeyIterator,它[定義內部調用Entry<K,V> nextEntry()方法的K next()方法,該方法返回在LinkedHashMap$Entry.after字段中定義的Entry

最後,在LinkedHashMap$Entry.addBefore(Entry<K,V> existingEntry)方法中可以看到,LinkedHashMap$Entry.after字段設置爲,訂購方式爲


哦,我...我已經聯繫我在groovy.runtime.DefaultGroovyMethodsjava.util.HashMapjava.util.LinkedHashMap確實到相應的源代碼的每個語句,總結了10個超鏈接。不幸的是,作爲Stackoverflow的新手,我只允許發佈一個,不得不刪除大多數鏈接...對不起。

+0

哇,榮譽男人! – Yossale 2010-10-25 12:32:52