2012-01-16 2 views
-1

Я использую groovy/grails, и у меня есть ResultList в моей службе, которую я использую для хранения результатов запроса.
Список содержит Объекты каждого месяца, такие как txn_jan, txn_feb ... txn_dec.
Так содержание списка следующим образом:
реализация custom list.addAll()

def qresultList = [txn_jan1,txn_jan2,txn_feb1,txn_april1,txn_dec1] 


Каждый из них представляет собой объект, который содержит поля, расположение и количество транзакций (TCOUNT).

Я хочу перебирать список, чтобы получить список различных местоположений и их суммарный подсчет транзакций. Итак, что-то похожее на псевдо-код ниже:
if txn_jan1.location = txn_feb1.location then the output list should contain txn_jan1.location and count= txn_jan1.tcount + txn_feb1.tcount.
Окончательно в списке результатов Мне нужно иметь список различных местоположений и их обновленные значения.
Как написать это в groovy?
С уважением,
Priyank

+0

Пример списка для нас, чтобы работать с действительно поможет ... The описание немного расплывчато –

ответ

2

Это звучит, как вы хотите использовать groupBy в группе по местоположению. Затем вы можете собирать группы, чтобы получить сумму транзакций. Например:

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

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

assert totalsByLocation1 == ['a': 40, 'b': 20] 

Альтернативой является просто пройти по списку и накапливать общий объем сделок на карте:

def totalsByLocation2 = [:].withDefault{0} 

qresultList.each { totalsByLocation2[it.location] += it.txs } 

assert totalsByLocation2 == ['a': 40, 'b': 20] 
+0

только одна последняя вещь, оставшаяся ... так, чтобы называть первое поле как местоположение и считаться t_count, поэтому я могу получить к ним доступ как it.location и it.t_count, поэтому окончательный список должен быть [location: 'a ', txs: 40 ..] вместо [' a ': 40] –

+0

Результаты 'collectEntries' на карте. Чтобы получить список карт, используйте 'collect':' qresultList.groupBy {it.location}. collect {key, vals -> [location: key, t_count: vals * .txs.sum()]} ' – ataylor

+0

спасибо большое! это прекрасно работает .. –

Смежные вопросы