Значение атрибута "Количество раз", измененное в коллекции - PullRequest
0 голосов
/ 06 октября 2019

В настоящее время я использую Java 8 и не могу переключиться на более поздние версии. Поскольку я не мог найти ничего подобного, возможно, кто-то знает уже реализованное решение. Это может быть сторонняя библиотека или использование лямбды и т. Д. Никаких ограничений. Любая помощь приветствуется!

Существует список с этой структурой, например:

| ID | Date       | Status | Name | Description      | Currency |
|----|------------|--------|------|------------------|----------|
| 1  | 2019-10-01 | 1      | 'A'  | 'Description A'  | USD      |
| 1  | 2019-10-01 | 3      | 'A'  | 'Description A2' | USD      |
| 1  | 2019-10-01 | 4      | 'A2' | 'Description A2' | USD      |
| 2  | 2019-10-03 | 1      | 'B'  | 'Description B'  | USD      |
| 2  | 2019-10-03 | 2      | 'B'  | 'Description B'  | BRL      |
| 2  | 2019-10-03 | 4      | 'B'  | 'Description B'  | USD      |
| 3  | 2019-10-05 | 1      | 'C'  | 'Description C'  | JPY      |
| 3  | 2019-10-05 | 2      | 'C'  | 'Description C2' | JPY      |

Проблема заключается в создании другого списка на основе исходного списка с полями:

  1. Дата;
  2. ID;
  3. Время Статус изменен;
  4. Время Имя или описание изменены;
  5. Время Валюта изменена;

Кроме того, требуются дополнительные поля (если это делает вопрос слишком сложным, я могу разделить его на другие вопросы):

Дни между датой последнего изменения и первой датой определенного идентификатора (что называется «старением»);

Отображение типа изменений:

7.1 «Имя / Описание», если только имя ИЛИ описание изменено

7.2 «Валюта», если изменена только валюта

7.3 «Оба», если имя или описаниеИ валюта изменена

Не обязательно быть List. Это может быть любой тип коллекции.

Первый список происходит из запроса SQL. Вот что я начал писать:

public List<Obj> getResultList() {
    List<Obj> resultList = new ArrayList<>();
    Map<String, Integer> counterMap = new HashMap<>();

    counterMap.put("status", 0);
    counterMap.put("name", 0);
    counterMap.put("description", 0);
    counterMap.put("currency", 0);

    StreamEx.of(sourceList).forPairs((current, next) -> {
        compareCurrentAndNext(current, next);
    });

    int countStatus = counterMap.get("status");

    // etc
}

private void compareCurrentAndNext(final Obj current,
                                   final Obj next) {
    if (current.getId().equals(next.getId())) {
        if (!current.getStatus().equals(next.getStatus())) {
            counterMap.replace("status", counterMap.get("status") + 1);
        }

        // etc
    }
}

Он использует библиотеку StreamEx (https://github.com/amaembo/streamex):

<dependency>
  <groupId>one.util</groupId>
  <artifactId>streamex</artifactId>
  <version>0.7.0</version>
</dependency>

На самом деле, есть еще много атрибутов, и я упростил реальную проблему здесь.

1 Ответ

0 голосов
/ 08 октября 2019

Если вам нужен новый список (resultList), где каждая запись в списке имеет 5 (или более) свойств, вам следует начать с создания класса с 5 (или более) полями.

Это не класс с именем Obj (что, кстати, действительно плохое имя), поскольку свойства результата отличаются от свойств источника. Определение этого класса важно для вашего кода, поэтому вам нужно его определить.

Затем, когда вы повторяете исходный список (sourceList), при изменении Date или ID вы создаетеновый объект результата и добавьте его в список результатов. Если Date и ID совпадают, вы сравниваете и увеличиваете счетчики изменений по мере необходимости.

Что касается свойства 6, я не уверен, что понимаю его требования, поэтому я 'Позвольте вам поработать над этим.

Для свойства 7 это действительно свойство, полученное из свойств 4 и 5, поэтому его можно реализовать как метод получения класса результата, получая его значение из двух счетчиков. поля.

...