2011-05-25 27 views

回答

9

另一種方法是使用Map.withDefault像這樣(以Ted的例子):

def map = [:].withDefault { [] } 
def id = 'foo' 
def newListItem = 'bar' 

map[id] << newListItem 

assert map[id] == ['bar'] 

map[id] << newListItem 

assert map[id] == ['bar', 'bar'] 
+0

不錯!我忘記了默認情況下,這是完美的這種情況下,我現在有一些代碼重構:) – 2011-05-25 13:18:42

+0

最簡潔,也最快!在Kyle的帖子中查看我的時間比較。 – 2011-05-26 04:55:27

1

我不知道一個更簡潔的方式,但沒有太多好看的替代方法是這樣的:

if (map[id]) map[id] << newListItem else map[id] = [newListItem] 

只是踢我跑在一個循環中每個語法100,000迭代:

def m = [:] 
for (def i=0; i<100000; ++i) { 
    //if (m['x']) m['x'] << 'val' else m['x'] = ['val'] 
    m['x'] = m['x'] ? m['x'] + 'val' : ['val'] 
} 

爲你的語法的時間結果爲:

real 0m45.367s 
user 0m47.647s 
sys 0m0.712s 

這句法的時間結果分別爲:

real 0m3.612s 
user 0m5.920s 
sys 0m0.252s 

結果在每次運行中都是一致的。所以我會說這個語法絕對是首選。我認爲不斷重新分配到哈希項是什麼減慢這麼多。 ?

+0

我的時間綜述: 原創 real \t 2m4.903s 用戶\t 1m47.753s SYS \t 0m8.025s 泰德的真實 \t 0m3.161s 用戶\t 0m3.308s SYS \t 0m0.329s 凱爾的 真正\t 0m3.010s 用戶\t0立方米.023s sys \t 0m0。323S 蒂姆 真正\t 0m2.697s 用戶\t 0m2.725s SYS \t 0m0.324s – 2011-05-26 04:58:33

3

使用貓王(:)操作稍微更簡潔:

def map = [:] 
def id = 'foo' 
def newListItem = 'bar' 

map[id] = (map[id] ?: []) << newListItem 

assert map[id] == ['bar'] 

map[id] = (map[id] ?: []) << newListItem 

assert map[id] == ['bar', 'bar'] 

但如果速度是很重要的,凱爾的答案是有點快,因爲它不做分配步驟(測試100000個環路上我的機器,他的1.36s和我的1.46s比原來的16.54s)。

+0

+1,簡明,因爲它得到 – virtualeyes 2011-05-25 05:59:58

+0

@virtualeyes [不太](http://stackoverflow.com/questions/6119282/best-way-to-initialize-addto-map-values-that-are-listing-in-groovy/6120617#6120617),有可能更多consise – 2011-05-25 07:23:58

+0

@tim,真的,我看你的答案是最簡潔的。爲你的答案+1了。 @Ted會回來什麼?喜歡Groovy中無數可能的解決方案; - ) – virtualeyes 2011-05-25 07:49:00

0

@Ted完全釘了它。

只是作爲一個練習,好奇/冒險可以嘗試:

List.metaClass.onMap = { Map m = [:], id-> 
    if(m[id]) 
     m[id] << delegate 
    else 
     m[id] = [delegate] 
} 
def id = 'foo' 
Map m = [:] 
List l = [1,2,3] 
m[id] = l.onMap(m,id) 

從此任何時候你有一個包含列表值的地圖,你可以使用List.onMap()來填充。

0

您需要的Groovy 1.8使用方法:

def map = [:].withDefault { [] } 

這是行不通的:

def map = [:[]] 
相關問題