假设我有一个针对数据库的SQL查询的GroovyRowResult条目列表:
def myQueryResults = [
{COLUMN0 = 'VALUE0', COLUMN1 = 'COMMONVALUE0'},
{COLUMN0 = 'VALUE1', COLUMN1 = 'COMMONVALUE0'},
{COLUMN0 = 'VALUE2', COLUMN1 = 'COMMONVALUE0'},
{COLUMN0 = 'VALUE3', COLUMN1 = 'COMMONVALUE1'},
{COLUMN0 = 'VALUE4', COLUMN1 = 'COMMONVALUE1'},
{COLUMN0 = 'VALUE5', COLUMN1 = 'COMMONVALUE1'}
]
我想将这个条目列表转换为这个地图结构:
def result = {
COMMONVALUE0 : ['VALUE0', 'VALUE1', 'VALUE2'],
COMMONVALUE1 : ['VALUE3', 'VALUE4', 'VALUE5']
}
我知道在Java中,使用Maps::uniqueIndex
可以使用Guava完成此操作。
Groovy实现此目的的方法是什么?谢谢!
更新:好的我想出了这个:
def rows = db.rows(myQuery)
def result = [:]
rows.each {
if (!result[it.COLUMN1]) {
result[it.COLUMN1] = []
}
result[it.COLUMN1] << it.COLUMN0
}
我确定必须有一种Groovier方法才能做到这一点吗?
答案 0 :(得分:3)
groupBy
做你想要的。然后收集一些
myQueryResults.groupBy{ it.COLUMN1 }.collectEntries{[it.key, it.value.COLUMN0]}
答案 1 :(得分:1)
您可以collectEntries
:
def myQueryResults = [
[COLUMN0 : 'VALUE0', COLUMN1 : 'COMMONVALUE0'],
[COLUMN0 : 'VALUE1', COLUMN1 : 'COMMONVALUE0'],
[COLUMN0 : 'VALUE2', COLUMN1 : 'COMMONVALUE0'],
[COLUMN0 : 'VALUE3', COLUMN1 : 'COMMONVALUE1'],
[COLUMN0 : 'VALUE4', COLUMN1 : 'COMMONVALUE1'],
[COLUMN0 : 'VALUE5', COLUMN1 : 'COMMONVALUE1']
]
groups = { maps ->
maps.collectEntries { e ->
[ (e.COLUMN1) : maps.findAll { it.COLUMN1 == e.COLUMN1 }*.COLUMN0 ]
}
}
assert groups(myQueryResults) == [
COMMONVALUE0 : ['VALUE0', 'VALUE1', 'VALUE2'],
COMMONVALUE1 : ['VALUE3', 'VALUE4', 'VALUE5']
]