【问题标题】:3-dimensions different types Map or List: List(ID=integer) of List(ID=integer) of int[]3维不同类型的Map或List:List(ID=integer) of List(ID=integer) of int[]
【发布时间】:2009-12-20 12:31:33
【问题描述】:

我要制作一张酒店桌子。 但是我在尝试用 Java 实现它时遇到了问题。

我的酒店有 Level(int id) x Room(int id) x Field 字符串状态,整数计数器)

同样的在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")); 

或者当它是列表&lt;List&lt;List&lt;String&gt;&gt;&gt;

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

感谢您的帮助:)

【问题讨论】:

    标签: java multidimensional-array hashmap


    【解决方案1】:

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

    然后每个对象都包含对其组件的引用(Hotel 包含Rooms 的列表等)。一旦你这样做了,我认为一切都应该变得更加清晰。此外,您的Hotel 对象了解如何找到Rooms,Room 对象了解如何获取其属性,并且您的调用代码变得不那么冗长,并且更少依赖于Hotel/Room执行。例如你可以这样做:

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

    因此您的对象为您(客户端)完成工作,而不是您在对象层次结构中导航并自己完成工作。

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

    【讨论】:

    • 我正在写一个与此非常相似的答案,击败我 :) 投票。
    【解决方案2】:

    你应该创建适当的类

    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 的了解更多,将其发展为更复杂的东西,那也没关系。

    【讨论】:

    • 我不会说 Java 纯粹主义者。也许是面向对象的纯粹主义者。我不认为上面的 Java 比(比如)C++ 有什么特别之处。
    【解决方案3】:
    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);
    

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

    【讨论】:

    • 疯狂怎么办?你能解释一下吗?
    • 我的意思是使用数组来保存所有这些东西,而不是类。
    【解决方案4】:

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

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

    【讨论】:

    • RoomKey 告诉我“房间的钥匙”。
    • 什么是“getRoomMap();”是用来?也许你想说的是 getRoomMap(): Map rooms = new HashMap(); ???
    • @Xamas:我的想法是 getRoomMap 方法不仅可以创建地图,还可以使用来自某个地方(例如数据库)的数据来填充它。 @Brian:对我来说也是。 :) 我同意,也许该类的另一个名称会更合适。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 2017-04-03
    • 2021-03-16
    相关资源
    最近更新 更多