list.groupBy()的问题

时间:2012-01-19 19:55:34

标签: collections groovy

我有一个列表如下

def qresultList = [
    [location: 'a', txs: 10],
    [location: 'b', txs: 20],
    [location: 'a', txs: 30]
]

我想获得不同位置的列表,其中tx的总和位于相同的位置..所以我在这样的位置上进行groupby:

def totalsByLocation1 = qresultList.groupBy{ it.location }.
    collectEntries{ key, vals -> [key, vals*.txs.sum()] }

上面的代码在SummaryUtilsService / getWorldSummary函数中 我收到以下错误

No signature of method: java.util.LinkedHashMap.collectEntries() is applicable for argument types: (summary.SummaryUtilsService$_getWorldSummary_closure3) values: [summary.SummaryUtilsService$_getWorldSummary_closure3@2750e6c9]

更新:查询的实际结果为

def qresultList =  [
        ['a', 10],
        ['b', 20],
        ['a', 30]
    ]

所以它是一个列表列表..

2 个答案:

答案 0 :(得分:5)

从早期的问题来看,我假设你使用的是Grails 1.3.7或其他东西

以前的常规1.8.X方式是:

def totalsByLocation1 = qresultList.groupBy{ it.location }.inject([:]) { map, val ->
  map << [ (val.key): val.value*.txs.sum() ]
}

修改

如果您的输入列表是:

def qresultList =  [
  ['a', 10],
  ['b', 20],
  ['a', 30]
]

然后你需要像:

qresultList.groupBy { it[ 0 ] }.collectEntries { k, v ->
  [ (k): v*.getAt( 1 ).sum() ]
}

答案 1 :(得分:1)

获取地图列表:

assert [[a:40], [b:20]] == qresultList.groupBy {it.location}.collect {[(it.key): it.value.sum{it.txs}]}

对于地图:

def locationTransactionSums = [:]
qresultList.groupBy {it.location}.each {
    locationTransactionSums.(it.key) = it.value.sum{it.txs}
}
assert [a:40, b:20] == locationTransactionSums