我想按值排序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()的迭代器是否總是按順序迭代它們。
謝謝!
我想按值排序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()的迭代器是否總是按順序迭代它們。
謝謝!
簡短的回答:是的,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
的Set<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.DefaultGroovyMethods
,java.util.HashMap
和java.util.LinkedHashMap
確實到相應的源代碼的每個語句,總結了10個超鏈接。不幸的是,作爲Stackoverflow的新手,我只允許發佈一個,不得不刪除大多數鏈接...對不起。
哇,榮譽男人! – Yossale 2010-10-25 12:32:52