房间预约设计
需求:
现在有这样一个场景。比如说有10间房间,我就拿其中的一间房间来说。比如说A号房间,有几个时间段被预约。2023-01-01到2023-01-08,2023-04-03到2023-04-12,2023-07-01到2023-08-24等等B号房间,有几个时间段被预约。2023-02-01到2023-02-08,2023-05-01到2023-05-03,2023-07-06到2023-07-24等等以此以此类推,预约时间段是不是固定的,这些预约时间段之间会有一些空白的时间片。然后这时候有几个人来预约房间。其中甲可能就是想在2023-05-04到2023-07-04,乙以的话想在2023年5月06号~5月9号进行预约房间。
这个时候的场景就是说乙的话在a房间,b房间都可以预约。如果他选择b房间的话,那么甲的话,就可能ab两个房间都不能预约了。如果说他选择的是a房间的话,那么甲的话可以预约b房间的,所以说现在就是要最大的满足,安排更多的人。可以预约时间。避免房间上的浪费, 而且上面所说的只是其中一个满足的条件。还有一个需要满足的条件是在于如果来了十个人在一个房间预约时间不冲动的情况下,尽量把人全部安排到一个房间上。然后才安排第二个房间。 这个场景不知道怎么实现。
import java.util.*;
class RoomBooking {
private String room;
private String start;
private String end;
public RoomBooking(String room, String start, String end) {
this.room = room;
this.start = start;
this.end = end;
}
public String getRoom() {
return room;
}
public String getStart() {
return start;
}
public String getEnd() {
return end;
}
}
public class RoomBookingSystem {
private Map<String, List<RoomBooking>> bookings;
private Set<String> bookedRooms;
public RoomBookingSystem() {
bookings = new HashMap<>();
bookedRooms = new HashSet<>();
}
public void addBooking(String room, String start, String end) {
RoomBooking booking = new RoomBooking(room, start, end);
if (!bookings.containsKey(room)) {
bookings.put(room, new ArrayList<>());
}
bookings.get(room).add(booking);
}
public void bookRoom(String person, String start, String end) {
Set<String> availableRooms = new HashSet<>();
for (String room : bookings.keySet()) {
if (!bookedRooms.contains(room)) {
List<RoomBooking> roomBookings = bookings.get(room);
boolean conflicts = false;
for (RoomBooking booking : roomBookings) {
if (start.compareTo(booking.getEnd()) <= 0 && end.compareTo(booking.getStart()) >= 0) {
conflicts = true;
break;
}
}
if (!conflicts) {
availableRooms.add(room);
}
}
}
if (availableRooms.isEmpty()) {
System.out.println(person + ":没有可用的房间!");
} else {
String chosenRoom = availableRooms.iterator().next();
bookedRooms.add(chosenRoom);
System.out.println(person + ":预约了 " + chosenRoom + " 房间!");
}
}
public static void main(String[] args) {
RoomBookingSystem system = new RoomBookingSystem();
// 添加房间预约时间段
system.addBooking("A", "2023-01-01", "2023-01-08");
system.addBooking("A", "2023-04-03", "2023-04-12");
system.addBooking("A", "2023-07-01", "2023-08-24");
system.addBooking("B", "2023-02-01", "2023-02-08");
system.addBooking("B", "2023-05-01", "2023-05-03");
system.addBooking("B", "2023-07-06", "2023-07-24");
// 预约房间
system.bookRoom("甲", "2023-05-04", "2023-07-04");
system.bookRoom("乙", "2023-05-06", "2023-05-09");
}
}
使用了字典数据结构来记录房间的预约情况和人员的预约情况。通过遍历待安排人员的预约时间段,与已有的房间预约情况进行比较,找到符合条件的房间,并记录已经预约的房间,以避免重复预约。