保留groovy中键值搜索的所有值

时间:2013-11-26 16:38:23

标签: groovy

我有声明

There are couple of values which satisfies the search criteria, but the first value is overwritten by the second and I could see only one value.

我是否需要使用其他数据类型?

示例:

我有一个列表:

[ [ name1:a, name2:b, name3:c, name4:d, other:1, other1:2 ],
  [ name1:a, name2:a, name3:b, name4:c, other:3, other1:4],  
  [ name1:a, name2:b, name3:c, name4:d, other:2, other1:3] ]

所以我想要的是name1,name1,name3,name4

的groupBy

- >我们有[其他:1,其他1:2]和[其他:2,其他1:3]

是否可以在groupBy中包含多个键?

1 个答案:

答案 0 :(得分:1)

Maps每个键只能有一个条目。

您可以拥有地图的值列表,例如[ key:[ val1, val2 ] ]

如果您的原始数据位于地图列表中,那么groupBy可能会有帮助吗?即:

def data = [ [ name:'a', value:1 ],
             [ name:'b', value:1 ],
             [ name:'a', value:1 ] ]

def result = data.groupBy { it.name }

assert result == [ a:[ [ name:'a', value:1 ],
                       [ name:'a', value:1 ] ],
                   b:[ [ name:'b', value:1 ] ] ]

assert result.a == [ [ name:'a', value:1 ], [ name:'a', value:1 ] ]

使用您的示例,您可以执行以下操作:

def list = [ [ name1:'a', name2:'b', name3:'c', name4:'d', other:1, other1:2 ],
             [ name1:'a', name2:'a', name3:'b', name4:'c', other:3, other1:4],  
             [ name1:'a', name2:'b', name3:'c', name4:'d', other:2, other1:3] ]

list.groupBy { [ name1:it.name1, name2:it.name2, name3:it.name3, name4:it.name4 ] }.collectEntries { k, v ->
    [ k, v.collect { [ other:it.other, other1:it.other1 ] } ]
}

它为您提供输出Map:

[ ['name1':'a', 'name2':'b', 'name3':'c', 'name4':'d']:[['other':1, 'other1':2], ['other':2, 'other1':3]],
  ['name1':'a', 'name2':'a', 'name3':'b', 'name4':'c']:[['other':3, 'other1':4]]]

你的意思是那样的?

修改

不使用collectEntries,这可能会有效:

list.groupBy { [ name1:it.name1, name2:it.name2, name3:it.name3, name4:it.name4 ] }
    .inject( [:] ) { map, key, value ->
        map[ key ] = value.collect { [ other:it.other, other1:it.other1 ] }
        map
}