Создать общий список карт в Groovy - PullRequest
0 голосов
/ 21 октября 2018

Из этого примера списка карт;

def Assets = [
   [year: 2018, valueA:10, value:15],
   [year: 2018, valueA:15, value:25],
   [year: 2019, valueA:11, value:35],
   [year: 2020, valueA:17, value:2],
   [year: 2020, valueA:18, value:5],
   [year: 2021, valueA:10, value:25],
   [year: 2018, valueA:15, value:20]
]

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

SummaryAssets = [
   [year: 2018, valueA:13, value:20],
   [year: 2019, valueA:11, value:35],
   [year: 2020, valueA:18, value:4],
   [year: 2021, valueA:10, value:25]
]

Единственный способ, которым я могу подумать, - это сначала найти и создать список уникальных лет.Затем на основе этих лет:

  1. Подсчет количества экземпляров каждого уникального года
  2. Суммарное значение A для каждого экземпляра года
  3. Суммарное значение B для каждого экземплярагод
  4. Разделите каждую сумму на количество повторных экземпляров
  5. Запишите результаты в новый список SummaryAssets

Это кажется громоздким.Есть ли более отличный способ сделать это?Спасибо.

1 Ответ

0 голосов
/ 21 октября 2018

Я бы, вероятно, использовал groupBy, но в противном случае сделал бы эквивалент того, что вы предлагаете:

def Assets = [
  [year: 2018, valueA:10, value:15],
  [year: 2018, valueA:15, value:25],
  [year: 2019, valueA:11, value:35],
  [year: 2020, valueA:17, value:2],
  [year: 2020, valueA:18, value:5],
  [year: 2021, valueA:10, value:25],
  [year: 2018, valueA:15, value:20]
]

def SummaryAssets = Assets.groupBy{ it.year }.collect{
  def v = it.value
  def avgForKey = { k -> [k, v[k].sum().div(v.size()).round()] }
  [year: it.key] + (v*.keySet().sum() - 'year').collectEntries(avgForKey)
}

assert SummaryAssets == [
  ['year':2018, 'valueA':13, 'value':20],
  ['year':2019, 'valueA':11, 'value':35],
  ['year':2020, 'valueA':18, 'value':4],
  ['year':2021, 'valueA':10, 'value':25]
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...