我打算建一张酒店餐桌。 但是当我尝试用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"));
感谢您的帮助:)
答案 0 :(得分:5)
我可能会将酒店建模为对象Hotel
,将房间建模为对象Room
等,而不是将所有内容堆叠在一个多层集合中。这变得非常冗长,一旦你改变了关系,那么这个变化就会反映在整个代码中。
然后每个对象都包含对其组件的引用(Hotel
包含Room
的列表等。一旦你这样做,我认为一切都应该变得更加清晰。此外,您的Hotel
对象了解如何查找Room
,Room
对象了解如何获取其属性,并且您的调用代码变得更简洁,并且更少依赖于{ {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))