Проверить что после введенной даты далее идут даты подряд из введенного списка
У меня есть метод который принимает список выходных и дату и проверяет идут ли после этой даты подряд выходные из переданного списка. Метод отрабатывает хорошо когда я ввожу первый день который является праздником и после него тоже идут праздники. Однако когда я ввожу день который не является праздником,но после него идут праздники метод не отрабатывает никак.
К примеру в листе со списком выходных лежат следующие даты :
('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 день) могут содержаться даты которые в этом листе есть
Ответы (1 шт):
Если я правильно понял вашу задачу, то вам необходимо делать следующее:
- В списке искать не только переданную дату, но и следующий день, так мы проверим условие, когда переданный день не является праздником, но следующий за ним - праздник(о чем вы и спрашивали)
- Если вам необходимо выводить даты, расположенные подряд, проверяйте в цикле текущую и следующую
Пример:
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;
}
}
}
В текущем примере не учитывается несколько граничных ситуаций, наподобие переданная дата - праздничная, и является последним элементом в списке.