Система онлайн-бронирования ресторанов (структуры данных)

У меня есть задача разработать систему онлайн-бронирования. Где пользователь может ввести почтовый индекс/количество людей/время бронирования и получить список ресторанов. Успенский (Пользователь и ресторан всегда в одном городе)

В каждом ресторане может быть несколько столиков с разным количеством посадочных мест. Итак, 2 стола на 4 человека и 4 стола на 4 человека.

У меня возникли проблемы с поиском правильных структур данных для использования.

Мои классы следующие

Ресторан: содержит время открытия, время закрытия, общее количество доступных мест. Не знаю, как я буду хранить информацию о столиках в ресторане. Не имеет смысла иметь отдельный класс для таблицы. Вся информация, которая мне нужна, это то, сколько таблиц бесплатно и каковы их размеры.

Бронирование: сохраняет фактическое бронирование и позволяет отменить бронирование.

ReservationSystem: содержит интерфейс для проверки доступности списка (долгое время, люди)». Как это вернет этот список? Сначала я думал об использовании priorityQueue для поддержания очереди с максимальным количеством доступных мест. Но затем я пройдусь по этому списку, чтобы увидеть, правильное ли время, чтобы сделать бронирование, а затем, как только бронирование будет сделано, обновить эту очередь. Одна проблема заключается в том, что очередь делает все дубликаты.

Мои конкретные вопросы:

  1. Как хранить информацию о таблице в каждом ресторане.
  2. Как лучше всего вести этот список ресторанов, чтобы я мог возвращать список без необходимости каждый раз сортировать эту информацию.

РЕДАКТИРОВАТЬ: На вопрос о том, как хранить информацию о таблице. Меня особенно беспокоит то, что хранение класса таблицы будет означать, что я создаю ненужные объекты. Вот мои рассуждения. 5 столов, за каждым из которых сидят 2 человека, имеют одинаковые предметы - я имею в виду, что нет никакой значимой информации, которая будет различаться между ними. Мне просто нужны цифры. нет мест/стола. (Если у меня есть стол из 4, но 3 человек, я буду считать этот стол занятым)

Я думал о создании 3 массивов. Допустим, таблица представляет 1,2 и т. д., поэтому int[] DifferentSeatingOnTable; его индексы — это таблицы, а значения — разрешенные места. Затем массив таблиц с totalNoOfThosetable, где индексы — это таблицы, а значения — общее количество таких таблиц. Аналогично для бесплатных таблиц freeTables, где индекс является таблицей и сколько таких свободных таблиц осталось.


person 12rad    schedule 17.08.2013    source источник
comment
Не могли бы вы опубликовать код классов вместо того, чтобы просто описывать их?   -  person Josh M    schedule 17.08.2013
comment
все зависит от уровня вашего проекта и от того, на что вы способны. прежде всего это выглядит как домашнее задание. нужно больше подробностей о том, что вы уже сделали   -  person Srinath Ganesh    schedule 17.08.2013
comment
«Set» не имеет дубликатов   -  person Srinath Ganesh    schedule 17.08.2013
comment
@SrinathGanesh Может ли набор сохранять приоритеты? Вы говорите о HashSet?   -  person 12rad    schedule 17.08.2013
comment
Set — это родительский интерфейс. вы можете использовать любой класс, включая HashSet . Говоря о приоритетах, можно было бы иметь поле для «размера семьи» и использовать его в качестве приоритета. иначе создайте набор и добавьте его в стек. так что по умолчанию вы можете добиться первого поступления   -  person Srinath Ganesh    schedule 17.08.2013


Ответы (3)


<сильный>1. ) Если вы просто записываете количество мест в ресторане, вы стреляете себе в ногу. Предположим, мне нужно сделать резервацию на 16 человек, и все они должны быть за одним столом (да, мне нужен довольно длинный стол). Ваша система могла бы привести моих гостей туда, где им пришлось бы сидеть за 8 столиками по два человека за каждым.

Вам нужен класс таблицы. Тогда в ваших ресторанах должны быть коллекции столов. Если вы хотите узнать, сколько мест у вас есть в ресторане, вам просто нужно пройтись по его коллекции столов и подсчитать количество мест. И если вы хотите знать, сможете ли вы усадить семью за один стол в ресторане, вам просто нужно проверить, есть ли в нем стол с таким количеством мест.

РЕДАКТИРОВАТЬ: есть более минималистичный способ хранить места для каждого ресторана. Используйте словарь, хеш-таблицу или любую другую структуру, содержащую ключи и связанные значения. Итак, пусть ключ представляет собой тип таблицы. Ключ может быть целым числом, указывающим, сколько человек сидит за столом. Значением является количество столов данного типа в ресторане. Я думаю, что это намного лучше, чем мое первоначальное предложение.

Так, например, ресторан с такой хэш-таблицей:

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

Имеет пять столов на 4 места каждый, 8 столов на 2 места каждый и один длинный стол на 16 человек. (Кроме того, использование таблицы для хранения таблиц является метаданным).

<сильный>2. ) Ваши рассуждения верны для оговорок. Если он делает дубликаты, вы должны опубликовать более конкретный вопрос, показывающий, как вы это делаете, чтобы мы могли попытаться помочь вам найти ошибку.

person Geeky Guy    schedule 17.08.2013
comment
Но сохранение класса таблицы будет означать, что я создаю ненужные объекты. Вот мои рассуждения. 5 столов, за каждым из которых сидят 2 человека, имеют одинаковые предметы - я имею в виду, что я не получаю от них никакой значимой информации, кроме мест/столов. Я думал о создании двух массивов. Допустим, таблица представляет 1,2 и т. д., поэтому int[] DifferentSeatingOnTable; его индексы — это таблицы, а значения — разрешенные места. Затем массив таблиц с totalNoOfThosetable, где индексы - это таблицы, а значения - это итоги такой таблицы. Аналогично для бесплатных столов. - person 12rad; 17.08.2013
comment
Понимаю. Почему бы вам не сделать это так: иметь словарь/хеш-таблицу вместо двух массивов. Ключом каждого элемента в структуре является количество мест за столом, а значением является количество столов, за которыми сидит такое количество людей. Я обновляю свой ответ этим. - person Geeky Guy; 17.08.2013

Реляционные базы данных упрощают выполнение обоих этих требований.

У вас будет две таблицы: RESTAURANT и SITTING (TABLE — это зарезервированное слово в SQL) с отношением «один ко многим» между ними.

РЕСТОРАН будет иметь имя, поэтому вы можете ЗАКАЗАТЬ ПО имени.

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);
    }
}
person duffymo    schedule 17.08.2013
comment
Я хотел использовать в памяти структуры данных. Какие-либо предложения? - person 12rad; 17.08.2013

1) хорошо.. я думаю, что было бы более разумно, если бы вы создали класс таблицы. это проще, чем пытаться сжать его в классе ресторана. и вам тоже было бы проще

2) поддерживать поле первичного ключа, возможно, составной ключ, выделяя уникальные, это может не допускать дубликатов

Рекомендации: Класс Res_Table Класс ресторана

поля первичного ключа с ORDERING

person Vihanga Gamage    schedule 17.08.2013