我试图建立一种方法来检查房间是否已经在某个时间预订,如果是,它应该告诉用户房间已经预订了。问题是即使房间在所选时间是空闲的,该方法总是移除预订的房间。因此,如果我从下午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);
}
}
}
}
答案 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
日期间隔与dateB
,dateE
间隔重叠,则if
阻止当前逻辑错误。
我假设结束日期总是大于或等于开始日期。要检查重叠的两个间隔,可以使用此方法(也可以删除冗余内部循环):
for (Booking bk : this.bookings) {
if (!dateB.after(bk.getEnd()) && !dateE.before(bk.getBeginning())) {
availableRooms.remove(bk.getRoom());
}
}
致谢:我使用了来自this answer的简短解决方案。