我猜我只是把这一切都搞错了,但我很好奇,所以我想我会问。
我正在开发一个预订系统,只是为了复习一些设计模式。我有一个房间类和客户类,我想保留一个时间表,其中客户在哪些日期在哪些房间。
我最初的想法是基于日期范围和房间应始终确定客户这一事实:(DateRange, Room) -> Customer
这使用数据库很容易实现,但如果可能的话,我希望坚持使用某种原生数据结构,所以我开始使用以 Reservation 对象作为键和 Customer 对象作为值的索引的 hashmap : HashMap<Reservation, Customer> schedule;
Reservation 对象将包含开始日期、结束日期和房间对象。
// Something kind of like this:
class Reservation
{
Date startDate;
Date endDate;
RoomComponent room;
public Reservation(Date startDate, Date endDate, RoomComponent room)
{
this.startDate = startDate;
this.endDate = endDate;
this.room = room;
}
如果日期重叠,我会覆盖(这是一个词吗?) Reservation 类的 equals 方法以返回 true。如果 hashmaps 使用 equals 方法作为主要比较器,这将完美地工作,但它们首先使用 hashcode 方法来提高效率。
// The overridden equals method:
@Override
public boolean equals(Reservation r)
{
// Reservations are equal if the rooms are the same and the dates overlap.
return
(
r.getRoom().equals(this.room)
&& ((r.getStartDate() >= this.startDate && r.getStartDate() <= this.endDate)
|| (r.getEndDate() >= this.startDate && r.getEndDate() <= this.endDate))
);
}
所以我的选择似乎是要么覆盖保留中的 hashcode 方法(我知道我应该这样做),要么覆盖 Schedule 类中的 containsKey 方法。问题是我想不出一种方法让重叠的日期具有相同的哈希码,这让我相信使用 equals 方法进行这种比较只是一个坏主意。重写 containsKey 方法也是一个坏主意,因为它完全违背了 hashmap 的目的和效率。
那么......是否有另一种数据结构可以更好地解决这个问题,或者我只是完全不考虑所有这些,并且应该重组所有东西?