2011-05-25 63 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 = [:[]]