我有声明
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中包含多个键?
答案 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
}