Java 三维不同类型映射或列表:int[]的列表(ID=integer)的列表(ID=integer)
我要建一张旅馆的桌子。 但我在尝试用Java实现这个时遇到了问题 我的酒店有级别(内部id)x房间(内部id)x字段(字符串状态,内部计数器) php中相同的将如下所示: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
$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))