Трехмерные разные типы Карта или Список: Список (ID = целое число) List (ID = целое число) int [] - PullRequest
2 голосов
/ 20 декабря 2009

Я собираюсь построить столик в отеле. Но у меня возникают проблемы при попытке реализовать это в Java.

Мой отель имеет Уровень ( int id ) x Номер ( int id ) x Поле ( String status, int counter )

То же самое в php будет выглядеть так:

$level=1; $room=2;
if(isset($hotel[$level][$room])) {
    print("Room: ".$level*100+$room);
    print(", Status: ".$hotel[$level][$room]['status']);
    print(", Total clients:".$hotel[$level][$room]['counter']);
}

И этот отпечаток возвращает меня (если комната существует): " Номер: 102, Статус: Зарезервировано, Всего клиентов: 8";

Теперь я хочу иметь то же самое в JAVA.

Но проблема в том, что я не могу построить это:

int[][][] my hotel;

Потому что в моем многомерном массиве есть разные типы.

Я пытался сделать что-то вроде этого:

Map<String, List<String>> myHotel = new HashMap<String, List<String>>();

Или:

List<List<List<String>>> myHotel;

Но

out.println(
    myHotel.get(1).get(2).get("status") + "\n" +
    out.println(myHotel.get(1).get(2).get("status"));

Или даже:

out.println("Status:" +
    myHotel.get(1).get(2).get(0) + "\tClients:" +
    myHotel.get(1).get(2).get(1)
);

Также как поставить элементы. Я думаю о чем-то вроде: КОГДА это таблица MAP :

myHotel.put(1).add(2).add(0, "Reserved")); 
// But better would be:
// myHotel.put(1).add(2).add("status", "Reserved")); 

или КОГДА это Список <List<List<String>>>:

myHotel.add(1).add(2).add(0, "Reserved"));
// But better would be:
// myHotel.add(1).add(2).add("status", "Reserved")); 

Спасибо за помощь:)

Ответы [ 4 ]

5 голосов
/ 20 декабря 2009

Вероятно, я бы смоделировал гостиницу как объект Hotel, комнату - как объект Room и т. Д., А не сложил бы все вместе в многоуровневую коллекцию. Это становится очень многословным очень быстро, и как только вы меняете отношения, это изменение отражается во всем вашем коде.

Каждый объект затем содержит ссылки на его компоненты (Hotel содержит список Room с и т. Д.). Как только вы сделаете это, я думаю, что все должно стать намного яснее. Более того, ваш объект Hotel понимает, как найти Room s, объекты Room понимают, как получить его атрибуты, и ваш вызывающий код становится намного менее многословным и намного менее зависимым от Hotel / Room реализация. например Вы можете сделать это:

Hotel hotel = new Hotel();
Set<Room> rooms = hotel.getFreeRooms(RoomType.NON_SMOKING);

и поэтому ваши объекты выполняют работу за вас (клиента), а не вы перемещаетесь по иерархии объектов и выполняете работу самостоятельно.

Это конечная цель ОО. Как только я обнаруживаю, что собираю коллекции коллекций, это часто свидетельствует о том, что необходим новый класс объектов.

3 голосов
/ 20 декабря 2009

Вы должны создать правильные классы

import java.util.*;

class Hotel {
    public List<Level> levels = new ArrayList<Level>();
}

class Level {
    public List<Room> rooms = new ArrayList<Room>();
}

class Room {
    public Status status = Status.FREE;
    public int counter = 0;
}

enum Status {
    FREE, OCCUPIED
}

и затем вы используете

Hotel hotel = new Hotel();
hotel.levels.add(new Level());
hotel.levels.get(0).rooms.add(new Room());
Room room = hotel.levels.get(0).rooms.get(0);
room.status = Status.OCCUPIED;
room.counter = 8;

и так далее ...

NB: конечно, пуристы ОО не придут и не скажут вам, что все эти поля должны быть приватными и доступными только через методы доступа. Но я бы сказал, что все в порядке, если вы начнете с этого самого простого проекта, а позже, по мере того, как будете изучать Java, перейдете к чему-то более сложному.

0 голосов
/ 20 декабря 2009

Так как уровень и номер комнаты являются ключом, я бы представлял комнату как объект значения следующим образом (как минимум):

class Room {
    public static enum Status {RESERVED, AVAILABLE}

    private Status status;
    private int numberOfPersons;

    // Getters and setters
}

А ключ как:

class RoomKey {
    private int levelNumber;
    private int roomNumber;

    public RoomKey(int levelNumber, int roomNumber) {
         this.leveNumber = levelNumber;
         this.roomNumber = roomNumber;
    }
}

И сохраняйте данные на карте как:

Map<RoomKey, Room> rooms = getRoomMap(); 
Room room = rooms.get(new RoomKey(levelNumber, roomNumber))
0 голосов
/ 20 декабря 2009
class HotelRoom{
     int roomnumber;
     int level;
     boolean reserved;
     int clientCount;

     public int getUniqueNumber(){
       return roomnumber + level*100;
     }
}

...
HotelRoom[][] hotel = new HotelRoom[floorCount][roomCount];

HotelRoom myRoom = hotel[floor][room];
System.out.print("room: " + myRoom.getUniqueNumber());
System.out.print(", Status: " myRoom.reserved);
System.out.print(", Total clients: " myRoom.clientCount);

Кстати, ваш дизайн довольно сумасшедший.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...