Java 三维不同类型映射或列表:int[]的列表(ID=integer)的列表(ID=integer)

Java 三维不同类型映射或列表:int[]的列表(ID=integer)的列表(ID=integer),java,multidimensional-array,hashmap,Java,Multidimensional Array,Hashmap,我要建一张旅馆的桌子。 但我在尝试用Java实现这个时遇到了问题 我的酒店有级别(内部id)x房间(内部id)x字段(字符串状态,内部计数器) php中相同的将如下所示: $level=1; $room=2; if(isset($hotel[$level][$room])) { print("Room: ".$level*100+$room); print(", Status: ".$hotel[$level][$room]['status']); print(", To

我要建一张旅馆的桌子。 但我在尝试用Java实现这个时遇到了问题

我的酒店有级别(内部id)x房间(内部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>>();
甚至:

out.println("Status:" +
    myHotel.get(1).get(2).get(0) + "\tClients:" +
    myHotel.get(1).get(2).get(1)
);
还有如何放置元素。我在想这样的事情: 当它是映射表时

myHotel.put(1).add(2).add(0, "Reserved")); 
// But better would be:
// myHotel.put(1).add(2).add("status", "Reserved")); 
或者当它是一个列表时:


感谢您的帮助:)

我可能会将酒店建模为一个对象
酒店
,将房间建模为一个对象
房间
等等,而不是将所有东西堆放在一个多层集合中。这很快就会变得非常冗长,一旦您更改了关系,这种更改就会反映在整个代码中

然后,每个对象都包含对其组件的引用(
Hotel
包含
Room
s等的列表)。一旦你这么做了,我想一切都会变得更加清晰。此外,您的
Hotel
对象了解如何查找
Room
s,
Room
对象了解如何获取其属性,您的呼叫代码变得不那么冗长,对
Hotel
/
Room
实现的依赖性也大大降低。e、 g.您可以这样做:

Hotel hotel = new Hotel();
Set<Room> rooms = hotel.getFreeRooms(RoomType.NON_SMOKING);
Hotel Hotel=新酒店();
套房=酒店。免费客房(房间类型。无烟);
因此,您的对象为您(客户机)完成工作,而不是您导航对象层次结构并自己完成工作


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

您应该创建适当的类

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
}
等等

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


顺便说一句,你的设计太疯狂了

由于标高和房间编号是关键,我将房间表示为一个值对象,如下所示(至少):

关键在于:

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))
Map rooms=getRoomMap();
房间=房间。获取(新房间钥匙(levelNumber,roomNumber))

我写了一个与此非常相似的答案,快告诉我:)投票赞成。我不会说Java纯粹主义者。也许是OO纯粹主义者。我认为上面提到的java没有任何东西(比如说C++)。你能解释一下吗?我只是想用数组来保存所有这些东西,而不是类。RoomKey对我说“房间的钥匙”。getRoomMap();”是用来做什么的?也许除了getRoomMap(),您想说:Map rooms=new HashMap()@Xamas:我的想法是getRoomMap方法不仅创建地图,而且使用来自某处的数据(例如数据库)填充地图@布莱恩:我也是。:)我同意,也许该类的另一个名称更合适。
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;
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);
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))