将GroovyRowResult列表索引到Map中

时间:2014-09-11 18:09:28

标签: grails groovy

假设我有一个针对数据库的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方法才能做到这一点吗?

2 个答案:

答案 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']
]