2012-11-16 89 views
16

我有興趣使用有序地圖在groovy(與gremlin這是一個圖形數據庫的DSL)。groovy排序地圖

我已經看過這個blog post在這裏有排序的地圖,但我仍然有點困惑。

  • 如何對已排序的地圖進行聲明?它與地圖y = [:]的標準方式有什麼不同嗎?

  • 當使用排序映射時,插入到列表中的項目將按照它們插入的順序排列嗎?或者在排序映射中的項目排序之前必須運行sort{}

回答

37

如果你只是聲明瞭一個地圖,像這樣:

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將不會自動保持排序。