AddTo就值映射,我發現自己反覆地編寫這些代碼:最好的方法來初始化/是列出在Groovy
map[id] = map[id] ? map[id] + newListItem : [newListItem]
有初始化值列表或添加到現有的列表更簡潔的方式?
AddTo就值映射,我發現自己反覆地編寫這些代碼:最好的方法來初始化/是列出在Groovy
map[id] = map[id] ? map[id] + newListItem : [newListItem]
有初始化值列表或添加到現有的列表更簡潔的方式?
另一種方法是使用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']
我不知道一個更簡潔的方式,但沒有太多好看的替代方法是這樣的:
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
結果在每次運行中都是一致的。所以我會說這個語法絕對是首選。我認爲不斷重新分配到哈希項是什麼減慢這麼多。 ?
我的時間綜述: 原創 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
使用貓王(:)操作稍微更簡潔:
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)。
+1,簡明,因爲它得到 – virtualeyes 2011-05-25 05:59:58
@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
@tim,真的,我看你的答案是最簡潔的。爲你的答案+1了。 @Ted會回來什麼?喜歡Groovy中無數可能的解決方案; - ) – virtualeyes 2011-05-25 07:49:00
@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()來填充。
您需要的Groovy 1.8使用方法:
def map = [:].withDefault { [] }
這是行不通的:
def map = [:[]]
不錯!我忘記了默認情況下,這是完美的這種情況下,我現在有一些代碼重構:) – 2011-05-25 13:18:42
最簡潔,也最快!在Kyle的帖子中查看我的時間比較。 – 2011-05-26 04:55:27