5

オンライン予約システムを設計する仕事があります。ユーザーが郵便番号/人数/予約時間を入力して、レストランのリストを取得できる場所。仮定(ユーザーとレストランは常に同じ都市にある)

各レストランには、座席数が異なる複数のテーブルがあります。なので、4人掛けのテーブルが2つと、4人掛けのテーブルが4つ。

使用する適切なデータ構造を考え出すのに苦労しています。

私のクラスは次のとおりです

Restaurant : timeofopening、timeOfClosing、totalNoOfSeatsAvailable が含まれています。レストラン内にテーブル情報を保存する方法がわかりません。テーブルに別のクラスを用意しても意味がありません。私が必要とするすべての情報は、どのように多くのテーブルが無料で、そのサイズはいくらかです。

予約: 実際の予約を維持し、予約をキャンセルすることができます

ReservationSystem : `List checkAvailability(long time, int people)' へのインターフェースが含まれています。これはどのようにしてこのリストを返しますか? 私は当初、priorityQueue を使用して、利用可能な最大座席数でキューを維持することを考えていました。しかし、そのリストを調べて、予約を行う時間が正しいかどうかを確認し、予約が行われたら、このキューを更新します。1 つの問題は、キューがすべての重複を行うことです。

私の具体的な質問は次のとおりです。

  1. 各レストラン内にテーブル情報を保存するにはどうすればよいですか?
  2. このレストランのリストを維持するための最良の方法は何ですか。これにより、この情報を毎回ソートすることなくリストを返すことができます。

編集:テーブル情報の保存方法に関する質問について。私の具体的な懸念は、テーブルクラスを保存すると、不要なオブジェクトが作成されることになるということです。これが私の推論です。それぞれ 2 人が座れる 5 つのテーブルには、まったく同じオブジェクトがあります。つまり、それらの間で異なる意味のある情報がないということです。数字が必要なだけです。座席/テーブルの数。

3つの配列を作成することを考えました。テーブルが 1、2 などを表すとしましょう。int[] differentSeatingOnTable; そのインデックスはテーブルであり、値は許可された座席です。次に、インデックスがテーブルで、値がそのようなテーブルの総数である totalNoOfThosetable を持つテーブルの配列。フリー テーブル freeTables についても同様です。ここで、インデックスはテーブルであり、そのようなフリー テーブルがいくつ残っているかを示します。

4

3 に答える 3

5

1. )レストランの座席数を確保するだけでは、自分自身を撃ってしまうことになります。16 人の予約をする必要があり、全員が同じテーブルにいる必要があるとします (そうです、かなり長いテーブルが必要です)。あなたのシステムは、ゲストを 2 人用の 8 つのテーブルに座らなければならない場所に連れて行くことができます。

テーブルクラスが必要です。次に、レストランにはテーブルのコレクションが必要です。レストランの座席数を知りたい場合は、そのテーブル コレクションを反復処理して座席数を数えるだけです。また、レストランの 1 つのテーブルに家族が座れるかどうかを知りたい場合は、その数の座席数を備えたテーブルがあるかどうかを確認するだけで済みます。

編集:レストランごとに座席を保存するための、より最小限の方法があります。キーと関連する値を保持するディクショナリ、ハッシュ テーブル、またはその他の構造を使用します。したがって、キーがテーブルのタイプを表すようにします。キーは、テーブルに何人が座っているかを示す整数である場合があります。値は、レストランに存在するそのタイプのテーブルの数です。これは私の最初の提案よりもはるかに優れていると思います。

たとえば、このようなハッシュ テーブルを持つレストランは次のようになります。

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

4人掛けのテーブルが5つ、2人掛けのテーブルが8つ、16人掛けのロングテーブルが1つ。(また、テーブルを格納するためにテーブルを使用することは非常にメタです)。

2. )あなたの推論は予約に対して正しい. 重複している場合は、どのように行っているかを示すより具体的な質問を投稿して、バグの特定を支援できるようにしてください。

于 2013-08-17T16:58:05.197 に答える
3

リレーショナル データベースは、これらの要件を両方とも簡単にします。

RESTAURANT と SITTING (TABLE は SQL の予約語) の 2 つのテーブルがあり、それらの間に 1 対多の関係があります。

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 クラス レストラン クラス

ORDERING を使用した主キー フィールド

于 2013-08-17T16:58:31.530 に答える