Как использовать несколько groupBy и max в Groovy - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь использовать методы Groovy groupBy и max для суммирования данных в моем списке.

До сих пор я создал класс с именем allowance, который я использую для создания списка разрешений, например

class allowance {
      Integer StartDate
      Integer EndDate
      String  PayCode
      Integer CreatedOn
}

def lAllowances = [
    new allowance(StartDate: 20200330, EndDate: 99991231, PayCode: "PC_DFB1", CreatedOn: 20200330)
   ,new allowance(StartDate: 20200330, EndDate: 99991231, PayCode: "PC_DFB1", CreatedOn: 20200420)
   ,new allowance(StartDate: 20180405, EndDate: 20200329, PayCode: "PC_DFB1", CreatedOn: 20180125)
   ,new allowance(StartDate: 20200330, EndDate: 99991231, PayCode: "PC_DFB2", CreatedOn: 20200330)
   ,new allowance(StartDate: 20100405, EndDate: 99991231, PayCode: "PC_CAR1", CreatedOn: 20100103)
   ]

Теперь мне нужно сгруппировать этот список и вернуть последнее созданное пособие на основе CreatedOn для ключа группировки (PayCode, StartDate).

Я могу получить его, чтобы вернуть то, что мне нужно, с одним Закрытие groupBy, например,

lAllowances.groupBy {it.PayCode}.collectEntries {[(it.key): it.value.max {it.CreatedOn}]}.each{ k,v ->
    mAllowances.put (iCount, [StartDate: v.StartDate, EndDate: v.EndDate, PayCode: k])
    iCount++
}

, но когда я указываю второе закрытие, метод max, похоже, не работает или, по крайней мере, он не возвращает того, что я думал, например,

lAllowances.groupBy ({it.PayCode},{it.StartDate}).collectEntries {[(it.key): it.value.max {it.CreatedOn}]}.each{ k,v ->
    mAllowances.put (iCount, [StartDate: v.StartDate, EndDate: v.EndDate, PayCode: k])
    iCount++
}

Ожидаемый набор результатов после группировки на основе приведенных выше данных будет выглядеть примерно так:

PayCode: "PC_DFB1", StartDate: 20200330, EndDate: 99991231, CreatedOn: 20200420
PayCode: "PC_DFB1", StartDate: 20180405, EndDate: 20200329, CreatedOn: 20180125
PayCode: "PC_DFB2", StartDate: 20200330, EndDate: 99991231, CreatedOn: 20200330
PayCode: "PC_CAR1", StartDate: 20100405, EndDate: 99991231, CreatedOn: 20100103

Любая помощь, которую вы можете оказать для решения этой проблемы, будет принята с благодарностью.

Спасибо!

1 Ответ

1 голос
/ 23 апреля 2020

Вы можете объединить поля для группировки, а затем собрать с максимальным закрытием для каждого из совпадений

def result = lAllowances.groupBy { it.StartDate + it.PayCode }
                        .collect { def matchKey, def matches -> 
                            return matches.max { it.CreatedOn }
                        }

, это возвращает описанный вами результат.

Если существует риск при конкатенации, создающей ложные совпадения (например, 1 + 11 и 11 + 1), вы можете вставить символ-разделитель, например |, между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...