Разделить список услуг на группы в пределах 14 дней
Есть список услуг, например:
List<Item> list = new ArrayList<>();
list.add(new Item(123456789, 01.04.2023));
list.add(new Item(123456789, 14.04.2023));
list.add(new Item(123456789, 21.04.2023));
list.add(new Item(123456789, 30.04.2023));
Даты в формате LocalDate
, но для наглядности указал так.
Необходимо разделить список услуг на группы так, чтобы в каждой группе были услуги в пределах 14 дней. Например для примера выше будет две группы:
Первая с датами 01.04.2023 и 14.04.2023 Вторая с датами 21.04.2023 и 30.04.2023
Я делаю так:
list.sort(Comparator.comparing(Item::getDate_in));
Map<Integer, List<Item>> groups = list.stream()
.collect(Collectors.groupingBy(i ->
(int) ChronoUnit.DAYS.between(list.get(0).getDate_in(), i.getDate_in()) / 14));
for (Map.Entry<Integer, List<Item>> entry1 : groups.entrySet()) {
System.out.println(entry1.getKey());
for (Item Item : entry1.getValue()) {
System.out.println(Item + " \n");
}
}
Но получается три группы ,вместо двух. Подскажите пожалуйста как правильнее разделить на группы?
Использовать Map<Boolean, List<Item>>
как в вопросе https://ru.stackoverflow.com/questions/1507202/Разделить-элементы-по-условиям/1507257?noredirect=1#comment2704072_1507257 не подходит так как это решение делить список на две группы, а возможна ситуация когда будет три группы. Например такая:
List<Item> list = new ArrayList<>();
list.add(new Item(123456789, 01.04.2023));
list.add(new Item(123456789, 14.04.2023));
list.add(new Item(123456789, 15.04.2023));
list.add(new Item(123456789, 30.04.2023));
Тут уже должно быть три группы.