即使未满足If-Statement,Java ArrayList也会始终删除对象

时间:2018-05-02 13:48:50

标签: java if-statement arraylist

我试图建立一种方法来检查房间是否已经在某个时间预订,如果是,它应该告诉用户房间已经预订了。问题是即使房间在所选时间是空闲的,该方法总是移除预订的房间。因此,如果我从下午2点到下午3点预订房间,然后尝试从下午4点到下午5点预订房间,那么它仍然可以从我的可用房间中取出房间。不知何故,我的if语句似乎总是正确的,即使它不应该是。

说明: 用户应该通过控制台输入日期(我还是初学者,这是一个大学项目,如果有任何重大错误,我很抱歉,还没有使用数据库)。日期保存在dateB(预订开始)和dateE(结束)中。我将之前创建的所有房间保存在ArrayList中,然后将它们保存在第二个房间(availabilitybeRooms)中,以便我可以删除已在请求的时间预订的房间。这一切都很好,除了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 :(得分:0)

你的if条件都错了,例如如果今天预订房间并且我明天要求房间,那么条件!dateB.before(bk.getBeginning()) && !dateE.before(bk.getBeginning()的第一部分将返回true,这不是你想要的。使用否定通常会使事情变得更难

这样看,如果请求的日期时间(dateB-DateE)与现有预订重叠,则房间不可用。所以我会创建一个带有日期和预订的私有方法,如果日期在getBeginning()getEnd()之间,则返回true,然后在if (...)子句中为dateB和dateB调用该方法dateE确定该时间段是否存在预订。

答案 1 :(得分:0)

假设目标逻辑是从availableRooms移除任何空间,如果Booking日期间隔与dateBdateE间隔重叠,则if阻止当前逻辑错误。

我假设结束日期总是大于或等于开始日期。要检查重叠的两个间隔,可以使用此方法(也可以删除冗余内部循环):

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

致谢:我使用了来自this answer的简短解决方案。