0

我猜我只是把这一切都搞错了,但我很好奇,所以我想我会问。

我正在开发一个预订系统,只是为了复习一些设计模式。我有一个房间类和客户类,我想保留一个时间表,其中客户在哪些日期在哪些房间。

我最初的想法是基于日期范围和房间应始终确定客户这一事实:(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 的目的和效率。

那么......是否有另一种数据结构可以更好地解决这个问题,或者我只是完全不考虑所有这些,并且应该重组所有东西?

4

0 回答 0