我有一个列表如下
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]
]
所以它是一个列表列表..
答案 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