2009-12-20 8 views
2

Je vais construire une table d'hôtel. Mais j'ai des problèmes en essayant de l'implémenter en Java.3 dimensions différents types Carte ou Liste: Liste (ID = entier) de Liste (ID = entier) de int []

Mon hôtel a Niveau (int id) x Chambre (int id) x Champ (Chaîne état, int contre)

Le même en php ressemblerait à:

$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']); 
} 

Et cette impression me retourne (si la chambre existe): "Chambre: 102, Statut: Réservé, Total des clients: 8";

Maintenant, je veux avoir la même chose en Java.

Mais le problème est que je ne suis pas en mesure de construire ceci:

int[][][] my hotel; 

Parce que, j'ai les différents types dans mon tableau multidimensionnel.

J'ai essayé de faire qqch comme ceci:

Map<String, List<String>> myHotel = new HashMap<String, List<String>>(); 

Ou:

List<List<List<String>>> myHotel; 

Mais

out.println(
    myHotel.get(1).get(2).get("status") + "\n" + 
    out.println(myHotel.get(1).get(2).get("status")); 

Ou encore:

out.println("Status:" + 
    myHotel.get(1).get(2).get(0) + "\tClients:" + 
    myHotel.get(1).get(2).get(1) 
); 

Aussi comment mettre des éléments. Je pense à qqch comme: quand il est une table MAP:

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

Ou quand il est une liste<List<List<String>>>:

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

Merci de nous aider :)

Répondre

5

I 'd probablement modeler l'hôtel comme un objet Hotel, la pièce comme un objet Room etc. plutôt que de tout empiler ensemble dans un multi collection -tiered. Cela devient très verbeux très rapidement, et dès que vous changez les relations, ce changement est reflété dans votre code. Chaque objet contient alors des références à ses composants (Hotel contient une liste de Room s etc.)

Chaque objet contient alors des références à ses composants. Une fois que vous faites cela, je pense que tout devrait devenir beaucoup plus clair.En outre, votre objet Hotel comprend comment trouver Room s, les objets Room comprendre comment obtenir ses attributs et votre code d'appel devient beaucoup moins verbeux, et beaucoup moins dépendant de l'implémentation Hotel/Room. par exemple. vous pouvez le faire:

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

et pour que vos objets font le travail pour vous (le client) plutôt que de vous naviguer dans la hiérarchie d'objets et de faire le travail vous-même.

C'est l'objectif ultime de OO. Dès que je me retrouve à constituer des collections de collections, c'est souvent un indicateur qu'une nouvelle classe d'objets est requise.

+0

J'écrivais une réponse très similaire à celle-ci, me battre à :) :) Voter. – JMM

3

Vous devez créer des classes appropriées

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 
} 

et vous utilisez

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; 

et ainsi de suite ...

 

NB: bien sûr, les puristes OO vous non viens et te dis que tous ces champs doivent b e privé et seulement accessible par des accesseurs. Mais je dirais que c'est correct si vous commencez avec ce design le plus simple et plus tard, alors que vous apprenez plus de Java, faites-le évoluer vers quelque chose de plus complexe.

+0

Je ne dirais pas puristes de Java. Peut-être des puristes OO. Je ne pense pas qu'il y ait quoi que ce soit dans ce qui précède à Java sur (disons) C++. –

+0

Votre droit, corrigé. – akuhn

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

Votre conception est assez fou, en passant.

+0

Fou comment? Pouvez-vous élucider? –

+0

Je voulais juste dire utiliser des tableaux pour contenir toutes ces choses, plutôt que des classes. –

0

Depuis le niveau et le numéro de chambre est la clé, je représente la chambre comme objet de valeur comme celui-ci (au minimum):

class Room { 
    public static enum Status {RESERVED, AVAILABLE} 

    private Status status; 
    private int numberOfPersons; 

    // Getters and setters 
} 

Et la clé comme:

class RoomKey { 
    private int levelNumber; 
    private int roomNumber; 

    public RoomKey(int levelNumber, int roomNumber) { 
     this.leveNumber = levelNumber; 
     this.roomNumber = roomNumber; 
    } 
} 

Et garde les données dans une carte comme:

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

RoomKey me dit «la clé de la chambre». –

+0

Que fait le "getRoomMap();" est utilisé pour? Peut-être insead de getRoomMap() que vous vouliez dire: Map rooms = new HashMap (); ??? – KestutisIT

+0

@Xamas: Je pensais que la méthode getRoomMap créait non seulement la carte mais la remplissait avec les données de quelque part, une base de données par exemple. @Brian: Pour moi aussi. :) Peut-être un autre nom pour cette classe serait plus approprié, je suis d'accord. – crunchdog