5

我的任务是设计一个在线预订系统。用户可以在其中输入邮政编码/人数/预订时间并获取餐厅列表。假设(用户和餐厅总是在同一个城市)

每个餐厅可以有多个座位数不同的桌子。因此,2 张可容纳 4 人的桌子和 4 张可容纳 4 人的桌子。

我在想出要使用的正确数据结构时遇到了麻烦。

我的课程如下

餐厅:包含开放时间、关闭时间、总NoOfSeatsAvailable 不确定我将如何在餐厅内存储餐桌信息。为表设置一个单独的类是没有意义的。我需要的所有信息是 howManytables 是免费的,它们的大小是多少。

Reservation:这会维护实际的预订并允许取消预订

ReservationSystem : 包含到 `List checkAvailability(long time, int people)' 的接口这将如何返回这个列表?我最初考虑使用 priorityQueue 来维护一个最大可用座位数的队列。但随后我将查看该列表以查看时间是否正确,甚至可以进行预订,然后在进行预订后更新此队列。一个问题是队列做所有重复。

我的具体问题是:

  1. 我如何在每家餐厅存储餐桌信息。
  2. 维护这个餐厅列表的最佳方法是什么,这样我就可以返回一个列表,而不必每次都对这些信息进行排序。

编辑:关于如何存储表信息的问题。我特别担心的是存储一个表类意味着我正在创建不必要的对象。这是我的推理。5 张桌子可容纳 2 个人,每张桌子都有完全相同的物品——我的意思是,它们之间没有任何有意义的信息会有所不同。我只需要数字。没有座位/桌子。(如果我有一张 4 人但 3 人的桌子,我会考虑这张桌子)

我想创建3个数组。假设表格代表 1,2 等,所以 int[] differentSeatingOnTable; 它的索引是表格,值是允许的座位。接下来是一个带有 totalNoOfThosetable 的表数组,其中索引是表,值是此类表的总数。对于索引为表的空闲表 freeTables 以及剩余多少这样的空闲表也是如此。

4

3 回答 3

5

1. )如果你只是把餐厅的座位数量储存起来,你就是在自取其辱。假设我需要为 16 人预订,而且他们都必须在同一张桌子上(是的,我需要一张很长的桌子)。你的系统可以把我的客人带到某个地方,他们必须坐在 8 张桌子上,每张桌子可以坐两个人。

你确实需要一个表类。那么你的餐厅需要有桌子的集合。如果您想知道餐厅有多少个座位,您只需遍历其餐桌集合并计算座位数。如果你想知道你是否可以让一家人坐在餐厅的一张桌子上,你只需要检查它是否有任何座位有这么多座位的桌子。

编辑:有一种更简约的方式来存储每家餐厅的座位。使用包含键和关联值的字典、哈希表或任何其他结构。所以让键代表一种表。键可能是一个整数,表示桌子坐了多少人。该值是餐厅中该类型餐桌的数量。我认为这比我最初的建议要好得多。

因此,例如,具有这样一个哈希表的餐厅:

Key | Value
 4  |   5
 2  |   8
16  |   1

有5张4人桌、8张2人桌、1张16人长桌。(也使用表来存储表是如此元)。

2.)你的理由是正确的保留。如果它在做重复,你应该发布一个更具体的问题来说明你是如何做的,这样我们就可以尝试帮助你找到错误。

于 2013-08-17T16:58:05.197 回答
3

关系数据库使这两个要求变得容易。

您将有两个表:RESTAURANT 和 SITTING(TABLE 是 SQL 中的保留字),它们之间存在一对多关系。

RESTAURANT 将有一个名称,因此您可以按名称订购。

package model;

class Table {
    private int id; 
    private int numSeats; 

    public Table(int id, int numSeats) { 
        this.id = id;
        this.numSeats = numSeats; 
    }
    public int getId() { return this.id; }
    public int getNumSeats() { return this.getNumSeats; }
}

class Restaurant implements Comparable {
    private String name;
    private List<Table> tables;

    public Restaurant(String name) {
        this.name = name; 
        this.tables = new ArrayList<Table>(); 
    }

    public void addTable(Table t) { this.tables.add(t); }
    public void removeTable(int id) {
       for (Table t : this.tables) {
           if (t.getId() == id) {
               this.tables.remove(t); 
               break;
           }
       }
    }    
    public int getCapacity() { 
        int capacity = 0;
        for (Table t : this.tables) {
            capacity += t.getNumSeats();
        }
        return capacity;
    }
    public int compareTo(Restaurant r) {
        return this.name.compareTo(r.name);
    }
}
于 2013-08-17T16:56:57.260 回答
0

1)嗯..我认为如果你创建了桌子类更有意义。它比试图在餐厅类中抽筋更容易。你也会发现它更容易

2)维护一个主键字段,可能是一个复合键,标出唯一性,这样可以防止重复

推荐:Res_Table 类 Restaurant 类

具有 ORDERING 的主键字段

于 2013-08-17T16:58:31.530 回答