我有興趣使用有序地圖在groovy(與gremlin這是一個圖形數據庫的DSL)。groovy排序地圖
我已經看過這個blog post在這裏有排序的地圖,但我仍然有點困惑。
如何對已排序的地圖進行聲明?它與地圖
y = [:]
的標準方式有什麼不同嗎?當使用排序映射時,插入到列表中的項目將按照它們插入的順序排列嗎?或者在排序映射中的項目排序之前必須運行
sort{}
?
我有興趣使用有序地圖在groovy(與gremlin這是一個圖形數據庫的DSL)。groovy排序地圖
我已經看過這個blog post在這裏有排序的地圖,但我仍然有點困惑。
如何對已排序的地圖進行聲明?它與地圖y = [:]
的標準方式有什麼不同嗎?
當使用排序映射時,插入到列表中的項目將按照它們插入的順序排列嗎?或者在排序映射中的項目排序之前必須運行sort{}
?
如果你只是聲明瞭一個地圖,像這樣:
def m = [:]
然後,你可以看到默認的Groovy使得LinkedHashMap
assert m.getClass().name == 'java.util.LinkedHashMap'
如果你看看它說documentation for LinkedHashMap:
哈希表和鏈接使用可預測的迭代順序列出Map接口的實現。這個實現與HashMap的不同之處在於它保持了一個雙向鏈表,它貫穿其所有條目。這個鏈表定義了迭代排序,這通常是鍵被插入映射的順序(插入順序)。
所以LinkedHashMap
有一個順序,你可以通過調用sort
def m = [ b:1, a:2 ]
// Sort by descending value
m = m.sort { -it.value }
println m // prints [a:2, b:1]
如果你想鍵的自然順序,那麼你可以使用Java的排序映射之一,這種影響在Groovy的順序爲TreeMap
說你要在Groovy中使用這個,你可以這樣做:
// def tm = [ tim_yates:1, F21:2 ] as TreeMap // works as well
TreeMap tm = [ tim_yates:1, F21:2 ]
然後打印這一點,你可以看到它被鑰匙下令:
println map // prints [F21:b, tim_yates:a]
一個TreeMap
將維持秩序您添加鍵。當您添加新值時,LinkedHashMap
將不會自動保持排序。