Проверить что после введенной даты далее идут даты подряд из введенного списка

Рейтинг: -2Ответов: 1Опубликовано: 02.05.2023

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

К примеру в листе со списком выходных лежат следующие даты :

('2023-01-01')
('2023-01-02')
('2023-01-03')
('2023-01-04')
('2023-01-05')
('2023-01-06')
('2023-01-07')
('2023-01-08')

При вводе 2023-01-01 метод отрабатывает верно. Однако если рассмотреть пример в котором в список праздников приходит:

   ('2023-02-22')
   ('2023-02-23')
   ('2023-02-24')

То при вводе 2023-02-21 метод не отрабатывает. В чем моя проблема? Как можно подкорректировать код?

Мой метод:

private void resultWeekend(LocalDate inputDate,, List<LocalDate> allHolidays) {
    

    int inputIndex = allHolidays.indexOf(inputDate);
 
    if (inputIndex == -1) {
        System.out.println("Введенной даты нет в списке");
    }

 
    for (int i = inputIndex + 1; i < allHolidays.size(); i++) {
        LocalDate currentDate = allHolidays.get(i);
         
        if (currentDate.equals(inputDate.plusDays(i - inputIndex))) {
            System.out.println("Следующая дата после " + inputDate + " - " + currentDate);
        } else { 
            break;
        }
    }

}

ДОПОЛНЕНИЕ 1

В allHolidays лежат не только даты из примеров выше,этот лист содержит около сотни дат в отсортированном по дате порядке. Я ожидаю что при вводе даты,которая не содержится в листе будет произведена проверка что после нее (дата + 1 день) могут содержаться даты которые в этом листе есть

Ответы

▲ 0Принят

Если я правильно понял вашу задачу, то вам необходимо делать следующее:

  1. В списке искать не только переданную дату, но и следующий день, так мы проверим условие, когда переданный день не является праздником, но следующий за ним - праздник(о чем вы и спрашивали)
  2. Если вам необходимо выводить даты, расположенные подряд, проверяйте в цикле текущую и следующую

Пример:

private void resultWeekend(LocalDate inputDate, List<LocalDate> allHolidays) {
    LocalDate nextDay = inputDate.plusDays(1);
    int inputIndex = allHolidays.indexOf(inputDate);

    if (inputIndex == -1) {
        inputIndex = allHolidays.indexOf(nextDay);

        if (inputIndex == -1) {
            System.out.println("Date not found in the list");
            return;
        }
    }

    System.out.println("Holidays after " + inputDate);

    for (int i = inputIndex; i < allHolidays.size(); i++) {
        LocalDate currentDate = allHolidays.get(i);

        if (currentDate.equals(inputDate)) { // если переданная дата праздничная, пропускаем
            continue;
        }

        System.out.println(currentDate);

        if (i + 1 == allHolidays.size()) {
            break; // найденная дата - последний праздник в списке
        }

        if (!currentDate.plusDays(1).equals(allHolidays.get(i + 1))) { // проверяем конец цепочки дат
            break;
        }
    }
}

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