проблема с list.groupBy () - PullRequest
       16

проблема с list.groupBy ()

1 голос
/ 19 января 2012

У меня есть список, как показано ниже

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

Я хочу получить отдельный список местоположений с суммой txs для одного и того же местоположения .. поэтому я делаю групповую обработку в местоположении, как это:

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 ]

5 голосов
/ 20 января 2012

Из предыдущих вопросов я предполагаю, что вы используете Grails 1.3.7 или что-то еще

Предварительно Groovy 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 голос
/ 20 января 2012

Для списка карт:

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
...