Java ArrayList всегда удаляет объекты, даже если If-Statement не выполняется - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь создать метод, который проверяет, забронирована ли комната в определенное время, и если это так, то она должна сообщить пользователю, что комната уже забронирована. Проблема заключается в том, что метод ВСЕГДА удаляет комнату, для которой было забронировано место, даже если эта комната свободна в выбранное время. Поэтому, если я забронирую номер с 14:00 до 15:00, а затем попытаюсь забронировать его с 16:00 до 17:00, он все равно удалит комнату из имеющихся номеров. Каким-то образом мое утверждение if кажется всегда верным, даже если оно не должно быть.

Пояснение: Предполагается, что пользователь вводит дату через консоль (я все еще новичок, и это проект для колледжа, извините, если есть какие-то странные ошибки, еще не использовал базу данных). Даты сохраняются в dateB (начало бронирования) и dateE (конец). Я сохраняю все свои комнаты, которые были созданы ранее, в ArrayList, а затем сохраняю их во второй (availableabeRooms), чтобы я мог удалить те, которые уже были забронированы в запрошенное время. Все это прекрасно работает, за исключением оператора if, который по какой-то причине всегда верен. Предполагается удалить только те номера, которые были забронированы в это конкретное время.

    Date dateB = null;
    Date dateE = null;
    System.out.println("Please enter the beginning of your booking (yyyy-MM-dd HH:mm): ");
    String enter = sc.nextLine();
    try
    {
        dateB = f.parse(enter);
    }catch(
    ParseException e)
    {
        e.printStackTrace();
    }
    System.out.println("Please enter the end of your booking: ");
    try
    {
        dateE = f.parse(sc.nextLine());
    }catch(
    ParseException e)
    {
        e.printStackTrace();
    }
     ArrayList<Room> availabeRooms = new ArrayList<Room>(); 
        for(Room r : rc.getRoomContainer()){
            availableRooms.add(r);
        }   
        for (Booking bk : this.bookings) {
            if (!dateB.before(bk.getBeginning()) && !dateE.before(bk.getBeginning()) 
                || !dateB.after(bk.getEnd()) && !dateE.after(bk.getEnd())) {
                for (Room r : rc.getRoomContainer()) {
                    if (bk.getRoom().equals(r)) {
                        availableRooms.remove(r);
                }
            }

        }
    }

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Предполагается, что предполагаемая логика состоит в том, чтобы удалить любую комнату из availableRooms, если Booking интервал даты перекрывается с интервалом dateB, dateE, блок if в настоящее время имеет неправильную логику.

Я предположил, что даты окончания всегда больше или равны датам начала. Чтобы проверить два перекрывающихся интервала, можно использовать этот подход (также можно удалить лишнюю внутреннюю часть цикла):

    for (Booking bk : this.bookings) {
        if (!dateB.after(bk.getEnd()) && !dateE.before(bk.getBeginning())) {
            availableRooms.remove(bk.getRoom());
        }
    }

Кредиты: я использовал краткое решение из этого ответа .

0 голосов
/ 02 мая 2018

У вас неверные условия, например, если номер забронирован на сегодня, а я спрашиваю номер завтра, тогда первая часть условия !dateB.before(bk.getBeginning()) && !dateE.before(bk.getBeginning() вернет истину, а это не то, что вам нужно. Использование отрицаний часто усложняет жизнь

Посмотрите на это так, номер недоступен, если запрошенное время даты (dateB-DateE) каким-то образом перекрывает существующее бронирование. Поэтому я бы создал частный метод, который принимает дату и бронирование и возвращает значение true, если дата находится в диапазоне от getBeginning() до getEnd(), а затем вызываю этот метод в предложении if (...) для dateB и dateE, чтобы определить, является ли бронирование существует для этого периода времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...