Новое Распределяем каналы MAX по категориям и территориям. Читать новость

Проверяем пересечение бронирований на 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 Библиотека | Мы в Телеграм
Просмотры: 161
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти