Globale ArrayList verwenden
-
Hallo,
kann mir jemand sagen, wie ich in Java eine "globale" ArrayList am besten erzeuge bzw. mir eine alternative Vorschlagen;
Ich erzeuge in einer Klasse Objekte vom Typ "Reservierung, und zwar in unterschiedlichen Methoden.
Diese Methoden werden im Hauptprogramm aufgerufen und geben die generierte Reservierung zurück, Beispiel:public Reservierung buche(Kunde k, int anzBetten, Datum beginn, Datum ende) { Zimmer[] zimmer_array = getHotel().getZimmer_array(); Zimmer zimmer = null; Reservierung res_temp = null; for (int i=0; i<zimmer_array.length; i++) { if (zimmer_array[i].getBetten() >= anzBetten) { zimmer = zimmer_array[i]; res_temp = new Reservierung (k, zimmer, beginn, ende); break; } } return res_temp; }
Alle erzeugten Reservierungen müssen in eine Liste abgelegt werden. Allerdings, möchte ich das obige Methode (als Beispiel) vor dem Durchführen der Reservierung, in der "globalen" Liste nachsieht, ob überhaupt das Zimmer reserviert werden kann (oder ob es bereits reserviert wurde).
Ich hoffe es ist verständlich was ich meine, würde mich freuen wenn da jemand eine Idee hat wie ich das am besten umsetze.
Gruss,
Lalas
-
Du machst dir so eine "Datenbank" Klasse als Singelton in der du das alles speicherst.
-
Vielen Dank, habe das mal eingebunden und läuft auch. Bin mir nur nicht sicher, ob ich das eigentliche Problem damit lösen kann:
Ich habe nun also ein ArrayList welche eine Reservierung enthält. Dabei hat eine Reservierung unter anderem die Attribute "Zimmernr" "Datum_beginn" und "Datum_ende".
Wie kann ich denn in der ArrayList schauen, ob es ein bereits ein Objekt "Reservierung" mit dem gleichen Datum_beginn hat ?
Ich habe es mal so probiert (auszugsweise):
public Reservierung buche(Kunde k, int anzBetten, Datum beginn, Datum ende) { for (int i=0; i<zimmer_array.length; i++) { if (zimmer_array[i].getBetten() >= anzBetten) { zimmer = zimmer_array[i]; Datum test_date = temp_data.get(0).getDatum_beginn(); System.out.println(test_date); if (test_date.compareTo(beginn) == 0) { System.out.println("ANFANGSDATUM ÜBERSCHNEIDET SICH"); continue; }
Ich habe im array eine Reservierung angelegt (index 0 also) und übergebe der Methode nun als beginn Datum ein identisches. Die compareTo-Methode funktioniert, liefert also 0 bei Gleichheit.
Seltsamerweise wird meine Probeausgabe von test_date nicht angezeigt, also ist irgendwo der Wurm im code...vielleicht jemand eine Idee ?Gruss,
Lalas
-
Muss es unbedingt eine ArrayList sein? Wie wäre es mit ner HashMap und nem Datum als key?
-
Ich verzweifel noch...
also ich habe es nun mit einer HashMap versucht, dabei als Hashkey das
Anfangsdatum einer Reservierung verwendet.
Ich weiss aber nicht ob mir das hilft, irgendwie fehlt mir nach mittlerweilen 6 Stunden rumprobieren der Kopf für die Logik.
Also hier nochmal meine gedachte Vorgehensweise:- Alle Zimmer des Hotels sind in einem array abgelegt
- Methode zum buchen wird aufgerufen
- Es wird nun das Zimmer-array komplett durchlaufen, um Zimmer zu finden welche zunächst einmal genug Betten bieten
- Nun muss geschaut werden, ob dieses Zimmer (identifizierbar über Zimmer-Nr) in der HashMap in einem Objekt vom Typ Reservierung bereits verwendet wird.
Hier das erste Problem, wie kann ich die HashMap durchlaufen und auf einzelne Attribute der abgelegten Objekte zugreifen ?
Ich hatte es zunächst versucht, indem ich als HashKey die Zimmer-Nr verwende. Funktioniert wunderbar, allerdings kann ich dann pro Zimmer nur eine Reservierung vornehmen. Ein Zimmer kann aber mehrfach gebucht sein (nämlich zu unterschiedlichen zeiträumen)- Falls Zimmer bereits gebucht, müssen die Attribute Start-/Enddatum dieser Reservierung mit der neuen Reservierung verglichen werdem.
- Kommt es zu keinen Überschneidungen, kann das Zimmer gebucht werden.
- Gibt es Überschneidungen muss das nächste Zimmer geprüft werden
Aber egal wie rum ich anfange, ich komme immer zu einer Stelle wo ich auf gewisse Attribute nicht direkt zugreifen kann.
Als eine Möglichkeit habe ich überlegt, die HashMap wieder in ein array umzukopieren. Dann kann ich per Schleife dieses array komplett abarbeiten.Nur gefällt mir der Gedanke garnicht (Speicherlastig, Zeitintensiv, etc).
Danke für die Hilfe soweit
Gruss,
Lalas
-
lalas schrieb:
- Nun muss geschaut werden, ob dieses Zimmer (identifizierbar über Zimmer-Nr) in der HashMap in einem Objekt vom Typ Reservierung bereits verwendet wird.
Hier das erste Problem, wie kann ich die HashMap durchlaufen und auf einzelne Attribute der abgelegten Objekte zugreifen ?
Ich hatte es zunächst versucht, indem ich als HashKey die Zimmer-Nr verwende. Funktioniert wunderbar, allerdings kann ich dann pro Zimmer nur eine Reservierung vornehmen. Ein Zimmer kann aber mehrfach gebucht sein (nämlich zu unterschiedlichen zeiträumen)- Falls Zimmer bereits gebucht, müssen die Attribute Start-/Enddatum dieser Reservierung mit der neuen Reservierung verglichen werdem.
- Kommt es zu keinen Überschneidungen, kann das Zimmer gebucht werden.
- Gibt es Überschneidungen muss das nächste Zimmer geprüft werden
Du kannst ja auch Map und Liste kombinieren.
So ähnlich z.B.:class Foo{ private int a; private String b; Foo(int a, String b){ this.a = a; this.b = b; } /** * @return the a */ public int getA() { return a; } /** * @return the b */ public String getB() { return b; } } public static void main(String[] args) { HashMap<Integer, List<Foo>> map = new HashMap<Integer, List<Foo>>(); // in paar werte einfügen List<Foo> list1 = new LinkedList<Foo>(); list1.add(new Foo(123,"Test")); map.put(1, list1); List<Foo> list2 = new LinkedList<Foo>(); list2.add(new Foo(456,"Wert")); map.put(2, list2); // wenns nr 2 schon gibt, noch was zur liste hinzufügen, sonst müsste man eine neue erstellen if( map.containsKey(2) ){ List<Foo> list = map.get(2); list.add(new Foo(456, "Wert2")); //nochmal alles ausgeben for (Iterator<Foo> iterator = list.iterator(); iterator.hasNext();) { Foo foo = iterator.next(); System.out.println(foo.getA() + " " + foo.getB()); } } }
Kannst natürlich auch Maps imt Maps usw machen.
-
obwohl ich schon lange mit iteratoren arbeite, bin ich noch nie auf die idee gekommen, die schleife so zu formulieren
for (Iterator<Foo> iterator = list.iterator(); iterator.hasNext();) { Foo foo = iterator.next(); System.out.println(foo.getA() + " " + foo.getB()); }
das find ich mal elegant. du hast mich erleuchtet