Удаление дубликатов в ArrayList принадлежит полю даты - PullRequest
0 голосов
/ 17 июня 2020

Я получил список объектов из моей базы данных, и я хотел бы удалить дубликаты с тем же идентификатором, за исключением дубликата с наименьшей датой, и если дата равна, я хотел бы сохранить объект с наименьшим " cxalap ":

Например:

Если мой список из базы данных следующий:

List<NotificationCnavOP> notificationCnavOPList = [{id = 1; date = 01/01/2000; cxalap= 1}, {id=2; date = 01/01/2001; cxalap = 2}, {id=2, date = 01/01/2002; cxalap=3}, {id=2, date = 01/01/2001; cxalap=2}]

Новый список фильтров сохранит первые два:

List<NotificationCnavOP> notificationCnavOPListFiltered = [{id = 1; date = 01/01/2000; cxalap= 1}, {id=2; date = 01/01/2001; cxalap = 2}]

Я понятия не имею, как сделать это

1 Ответ

0 голосов
/ 17 июня 2020
  1. Сортируйте свой список сначала по id, затем по date, а затем по cxalap.
  2. Объедините отсортированный список в Map с id в качестве ключ. В случае конфликта сохраните первую запись и отбросьте другие. Поскольку список уже отсортирован, этот шаг гарантирует, что первая запись для id будет сохранена, а другие будут отброшены. Проверьте Collectors.toMap , чтобы узнать больше об этом.
  3. Соберите поток значений Map как окончательный List.

    List<NotificationCnavOP> result=
                    notificationCnavOPList
                    .stream()
                    .sorted(Comparator.comparing(NotificationCnavOP::getId)
                            .thenComparing(e -> LocalDate.parse(e.getDate(), DateTimeFormatter.ofPattern("dd/MM/yyyy")))
                            .thenComparing(NotificationCnavOP::getCxalap))
                    .collect(Collectors.toMap(NotificationCnavOP::getId, Function.identity(), (e1, e2) -> e1))
                    .values()
                    .stream()
                    .collect(Collectors.toList());
    

    Демо:

    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.List;
    import java.util.function.Function;
    import java.util.stream.Collectors;
    
    public class Main {
        public static void main(String[] args) throws Exception {
            List<NotificationCnavOP> notificationCnavOPList = new ArrayList<>(
                    Arrays.asList(
                            new NotificationCnavOP(1, "01/01/2000", 1), 
                            new NotificationCnavOP(2, "01/01/2001", 2),
                            new NotificationCnavOP(2, "01/01/2002", 3), 
                            new NotificationCnavOP(2, "01/01/2001", 2)));
    
            List<NotificationCnavOP> result = 
                    notificationCnavOPList
                    .stream()
                    .sorted(Comparator.comparing(NotificationCnavOP::getId)
                            .thenComparing(e -> LocalDate.parse(e.getDate(), DateTimeFormatter.ofPattern("dd/MM/yyyy")))
                            .thenComparing(NotificationCnavOP::getCxalap))
                    .collect(Collectors.toMap(NotificationCnavOP::getId, Function.identity(), (e1, e2) -> e1))
                    .values()
                    .stream()
                    .collect(Collectors.toList());
    
            System.out.println(result);
        }
    }
    
    class NotificationCnavOP {
        private int id;
        private String date;
        private int cxalap;
    
        public NotificationCnavOP(int id, String date, int cxalap) {
            this.id = id;
            this.date = date;
            this.cxalap = cxalap;
        }
    
        public int getId() {
            return id;
        }
    
        public String getDate() {
            return date;
        }
    
        public int getCxalap() {
            return cxalap;
        }
    
        @Override
        public String toString() {
            return "[" + id + ", " + date + ", " + cxalap + "]";
        }
    }
    

    Вывод:

    [[1, 01/01/2000, 1], [2, 01/01/2001, 2]]
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...