Перейти к содержимому
Максиметер

Проверяем пересечение бронирований на Java!

Проверяем пересечение бронирований на Java! В календаре нужно отклонить новую бронь, если выбранное время уже занято. Для проверки достаточно сравнить начало и конец двух интервалов, не перебирая каждую минуту внутри них. Сделаем модель с полуоткрытым интервалом, где начало включается, а конец уже свободен: record Booking(LocalDateTime start, LocalDateTime end) {     Booking {         if (!start.isBefore(end)) {             throw new IllegalArgumentException("End must be after start");         }     } boolean overlaps(Booking other) {         return start.isBefore(other.end())             && other.start().isBefore(end);     } } Проверка не даст создать бронь нулевой или отрицательной длины. Условие пересечения учитывает обе границы и не считает соседние интервалы конфликтом. Подготовим уже занятые промежутки и новый запрос: List<Booking> existing = List.of(     new Booking(start1, end1),     new Booking(start2, end2) ); Booking requested = new Booking(requestStart, requestEnd); Здесь предполагается, что все значения уже приведены к одной временной зоне. Для расписания в нескольких регионах лучше сравнивать Instant, а исходный ZoneId сохранять отдельно. Проверим весь список и получим понятный результат: boolean conflict = existing.stream()     .anyMatch(booking -> booking.overlaps(requested)); anyMatch завершает проверку, как только найдёт первое пересечение. Если conflict равен false, новую бронь можно добавить, а интервалы, которые соприкасаются ровно по границе, останутся допустимыми. Java Библиотека | Мы в Телеграм

339 просмотров

Канал в каталоге Максиметера

1 405 подписчиков · Развлечения

Ещё по теме «Развлечения»

Читать дальше

Два раза в неделю свежие посты этого канала — на почту и в личную ленту. Без повторного поиска канала вручную.