Collections list.groupBy()的问题

Collections list.groupBy()的问题,collections,groovy,Collections,Groovy,我有一个清单如下 def qresultList = [ [location: 'a', txs: 10], [location: 'b', txs: 20], [location: 'a', txs: 30] ] 我想得到不同的位置列表,同一位置的txs之和。。因此,我正在进行groupby定位,如下所示: def totalsByLocation1 = qresultList.groupBy{ it.location }. collectEntries{ k

我有一个清单如下

def qresultList = [
    [location: 'a', txs: 10],
    [location: 'b', txs: 20],
    [location: 'a', txs: 30]
]
我想得到不同的位置列表,同一位置的txs之和。。因此,我正在进行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]
    ]

因此,这是一个列表列表。

从前面的问题来看,我假设您使用的是Grails 1.3.7或其他什么

groovy 1.8.X之前的实现方法是:

def totalsByLocation1 = qresultList.groupBy{ it.location }.inject([:]) { map, val ->
  map << [ (val.key): val.value*.txs.sum() ]
}
然后,您将需要以下内容:

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

从前面的问题来看,我假设您使用的是Grails1.3.7或其他东西

groovy 1.8.X之前的实现方法是:

def totalsByLocation1 = qresultList.groupBy{ it.location }.inject([:]) { map, val ->
  map << [ (val.key): val.value*.txs.sum() ]
}
然后,您将需要以下内容:

qresultList.groupBy { it[ 0 ] }.collectEntries { k, v ->
  [ (k): v*.getAt( 1 ).sum() ]
}
有关地图列表:

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
有关地图列表:

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

你有什么问题?你所要问的是代码是否正确……运行它……你得到了预期的结果吗?我假设你使用的是Groovy的旧版本?你有什么问题?你问的只是代码是否正确…运行它…你得到了你期望的结果吗?我想你使用的是Groovy的旧版本?很好,但这是一个映射列表,而不是映射
[a:40,b:20]
没有意识到这是他们想要的。。。更新我的帖子。我需要学习如何使用.inject().Nice,但这是一个映射列表,而不是一个映射
[a:40,b:20]
没有意识到这是他们想要的。。。更新我的帖子。我需要学习如何使用.inject()。好的…正如你所说的..我刚刚发现我的resultset没有命名属性'location'和txs。。。这就是导致错误的原因。。因此,我可以用索引[0]和[1]替换“.location”和“.txs”,这样应该仍然可以工作??感谢您指出..获取此错误:没有方法的签名:java.util.LinkedHashMap.collectEntries()适用于参数类型:(summary.SummaryUtilsService$\u getResourceEventComparisonChart\u closure8)值:[summary.SummaryUtilsService$\u getResourceEventComparisonChart]_closure8@2dc5c9ca]好的…正如你所说的..我刚刚发现我的resultset没有命名属性'location'和txs。。。这就是导致错误的原因。。因此,我可以用索引[0]和[1]替换“.location”和“.txs”,这样应该仍然可以工作??感谢您指出..获取此错误:没有方法的签名:java.util.LinkedHashMap.collectEntries()适用于参数类型:(summary.SummaryUtilsService$\u getResourceEventComparisonChart\u closure8)值:[summary.SummaryUtilsService$\u getResourceEventComparisonChart]_closure8@2dc5c9ca]