三维不同类型Map或List:int []的List(ID =整数)的List(ID =整数)

时间:2009-12-20 12:31:34

标签: java multidimensional-array hashmap

我打算建一张酒店餐桌。 但是当我尝试用Java实现它时,我遇到了问题。

我的酒店有级别( int id x 会议室( int id x 字段 字符串 状态,计数器

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 个答案:

答案 0 :(得分:5)

我可能会将酒店建模为对象Hotel,将房间建模为对象Room等,而不是将所有内容堆叠在一个多层集合中。这变得非常冗长,一旦你改变了关系,那么这个变化就会反映在整个代码中。

然后每个对象都包含对其组件的引用(Hotel包含Room的列表等。一旦你这样做,我认为一切都应该变得更加清晰。此外,您的Hotel对象了解如何查找RoomRoom对象了解如何获取其属性,并且您的调用代码变得更简洁,并且更少依赖于{ {1}} / Hotel实施。例如你可以这样做:

Room

所以你的对象为你(客户端)工作,而不是你自己导航对象层次结构并完成工作。

这是OO的最终目标。一旦我发现自己将集合集合在一起,这通常表明需要新的对象类。

答案 1 :(得分:3)

你应该创建适当的类

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;

等等......

注意:当然,OO纯粹主义者不会告诉你所有这些字段都必须是私有的,只能通过访问者访问。但是我会说如果你从这个最简单的设计开始就可以了,之后,随着你学习更多Java,将它演变成更复杂的东西。

答案 2 :(得分:0)

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);

顺便说一句,你的设计非常疯狂。

答案 3 :(得分:0)

由于等级和房间号是关键,我会将房间表示为这样的价值对象(至少):

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中:

Map<RoomKey, Room> rooms = getRoomMap(); 
Room room = rooms.get(new RoomKey(levelNumber, roomNumber))