Question

Ceci est quelque peu lié à ma question précédente, mais j'ai réalisé que je devais faire face à la question de la nidification plus tôt dans le problème, alors c'est où je suis. (Je ne suis pas non plus loin d'être un débutant à Java, alors veuillez supporter avec moi).

Je crée un système de réservation simple pour 5 chambres qui prendront des noms, des heures, des numéros de pièce et des jours. Cela doit être fait en utilisant des treemaps imbriqués. Voici la disposition des données telles que je la vois, où Parethes représente les limites d'un Treemap:

(Jour, (chambre #, (heure, nom)))

Pour autant que je puisse voir, j'ai besoin d'un Treemap pour les temps et les noms, un pour chaque pièce, puis un pour chaque jour. Cela signifie une fois / nom Treemap par pièce par jour, ce qui signifie 1 x 5 x 7 = 35 Treemaps. Comme ça:

{Mon,  [Room 1,  (0600, NameA
                  0630, NameB
                  0700, NameC)
        Room 2,  (0600, NameD
                  0630, NameE)
        Room 3,  (0600, NameF
                  0630, NameG)]
Tues,  [Room 1,  (0600, Name1
                  0630, Name2)
        Room 2,  (0600, Name3
                  0630, Name4
                  0700, Name5)]}

(Les différents types de supports représentent les limites des Treemaps imbriqués)

Après être parvenue à cette conclusion, mon prochain problème est d'itréger une boucle pour créer tous ces Treemaps. Je n'arrive pas à générer dynamiquement les Treemaps à l'aide d'une boucle pour une boucle, car je ne peux pas coller le numéro de variable d'un compteur sur le nom de Treemap nouvellement créé.

J'ai eu ceci:

TreeMap keyDay = new TreeMap();
TreeMap keyRoom = new TreeMap();
TreeMap keyTime = new TreeMap();

Mais ce n'est que trois, ce qui n'est clairement pas suffisant pour permettre la duplication des clés - toutes les nouvelles entrées pour EG '0900' (clé temporelle) ou par exemple «Room 1» (clé de pièce) écraseront les anciens.

Est-ce que quelqu'un a des suggestions? Serait très apprécié :)

Était-ce utile?

La solution

Je suis d'accord que c'est vraiment super méga. Mais si vous souhaitez implémenter cette fonctionnalité, je recommande plutôt HashMaps. Voici une classe qui implémente les fonctionnalités que vous souhaitez:

public class Reservations {

static final int  DAY_SUN = 0, DAY_MON = 1, DAY_TUE = 2, DAY_WED = 3, DAY_THU = 4, DAY_FRI = 5, DAY_SAT = 6;
static final int ROOM_1 = 0, ROOM_2 = 1, ROOM_3 = 2, ROOM_4 = 3, ROOM_5 = 4;
private static HashMap<Integer[], String[]> hMap = new HashMap<Integer[], String[]>();


static String [] getStringForValue(Integer[] i){
    return hMap.get(i);
}

static TreeSet<String> getOrderedOutputStrings(){
    TreeSet<String> set = new TreeSet<String>();
    for(Entry<Integer[],String[]> e : hMap.entrySet()){
        int day_int = Reservations.getDay(e.getKey());
        int room_int = Reservations.getRoom(e.getKey());
        int time = Reservations.getTime(e.getValue());
        String name = Reservations.getGuestName(e.getValue());
        String day = Reservations.dayToString(day_int);
        String room = Reservations.roomToString(room_int);
        if(time > 0)
        set.add("DAY: " + "(" + day_int + ")" + day + " (" + room_int + ")"+ "ROOM: " + room + " :: " + name + " @ " + time);
    }
    return set;
}



static void setupMap() {
    for (int day = 0; day < 7; day++) {
        for (int room = 0; room < 5; room++) {
            addGuest(day, room, (int)(Math.random()*1000), "Bob TestCase");
        }
    }
}

static void addGuest(int day, int room, int time, String name) {
    Integer[] ref = new Integer[2];
    ref[0] = day;
    ref[1] = room;
    String[] s = new String[2];
    s[0] = Integer.toString(time);
    s[1] = name;
    hMap.put(ref, s);
}

static String[] lookupRoom(int day, int room) {
    Integer[] i = new Integer[2];
    i[0] = day;
    i[1] = room;
    return hMap.get(i);
}

static int getDay(Integer[] i){
    return i[0];
}

static int getRoom(Integer[] i ){
    return i[1];
}

static int getTime(String[] s) {
    return Integer.parseInt(s[0]);
}

public static String getGuestName(String[] s) {
    return s[1];
}

public static String dayToString(int i){
    switch(i){
        case 0:
            return "SUNDAY";
        case 1:
            return "MONDAY";
        case 2:
            return "TUESDAY";
        case 3:
            return "WEDNESDAY";
        case 4:
            return "THURSDAY";
        case 5:
            return "FRIDAY";
        case 6:
            return "SATURDAY";
        default:
            return null;
    }
}

public static String roomToString(int i){
    switch(i){
        case 0:
            return "ROOM ONE";
        case 1:
            return "ROOM TWO";
        case 2:
            return "ROOM THREE";
        case 3:
            return "ROOM FOUR";
        case 4:
            return "ROOM FIVE";
        default:
            return null;
    }
}

}

Voici un principal qui exécute la classe de réservations:

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    Reservations.setupMap(); //Run to test TODO: remove setupMap() from Reservation class 
    Reservations.addGuest(Reservations.DAY_MON, Reservations.ROOM_2, 1230, "John Doe");

    TreeSet<String> set = new TreeSet<String>();
    for(String s: Reservations.getOrderedOutputStrings()){
        System.out.println(s + "\n");
    }


}
}

Et enfin, en utilisant setupMap et la seule entrée, il produit:

DAY: (0)SUNDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 423

DAY: (0)SUNDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 637

DAY: (0)SUNDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 731

DAY: (0)SUNDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 424

DAY: (0)SUNDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 427

DAY: (1)MONDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 335

DAY: (1)MONDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 580

DAY: (1)MONDAY (1)ROOM: ROOM TWO :: John Doe @ 1230

DAY: (1)MONDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 700

DAY: (1)MONDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 556

DAY: (1)MONDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 92

DAY: (2)TUESDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 84

DAY: (2)TUESDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 964

DAY: (2)TUESDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 981

DAY: (2)TUESDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 294

DAY: (2)TUESDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 22

DAY: (3)WEDNESDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 216

DAY: (3)WEDNESDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 838

DAY: (3)WEDNESDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 198

DAY: (3)WEDNESDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 494

DAY: (3)WEDNESDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 796

DAY: (4)THURSDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 617

DAY: (4)THURSDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 866

DAY: (4)THURSDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 799

DAY: (4)THURSDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 242

DAY: (4)THURSDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 178

DAY: (5)FRIDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 491

DAY: (5)FRIDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 16

DAY: (5)FRIDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 838

DAY: (5)FRIDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 63

DAY: (5)FRIDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 860

DAY: (6)SATURDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 73

DAY: (6)SATURDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 759

DAY: (6)SATURDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 15

DAY: (6)SATURDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 115

DAY: (6)SATURDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 21

Ce résultat a été généré en moins d'une seconde. Je promets que c'est infiniment plus efficace que les treemaps imbriqués. Bonne chance!

Autres conseils

On supposerait que la journée est en fait une énumération, donc la carte de niveau supérieur devrait être un énumap

Map<Day, Map<String, Map<Integer, String>>> bookings = new EnumMap<Day, Map<String, Map<Integer, String>>>(Day.class);

Pas vraiment une réponse, mais plutôt une pensée;)

En effet, comme Xappymah l'a souligné dans les commentaires, une approche plus naturelle serait d'inventer des types spécifiques au domaine pour votre tâche. Comme:

interface Room {
    String getName();
    public void bookRoom(Booking booking) throws AlreadyBookedException;
}

interface Person {
    String getName();
}

class Interval {
    Date startTime;
    long duration;
}

interface Booking {
    Interval getInterval();
    Room getBookedRoom() throws NotBookedYetException;
    Set<Person> getParticipants();
}

interface BookingUtils {
    Set<Booking> getBookingsForInterval(Interval interval);
    Set<Booking> getBookingsOfRoom(Room room);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top