Tipp für Aufgabe

javac-

Mitglied
Guten Abend,

ich brauche bei einer Aufgabe Hilfe, da ich nicht recht weiß wie ich anfangen soll. Es geht um eine Hotelbuchungssoftware.(Natürlich nur für Übungszwecke)

In einem Hotel gibt es 8 Standart-, 5 Luxus- und 3 Businesszimmer

1)Ich soll eine Methode schreiben die überprüft ob die gewünschte Zimmerkategorie die der Kunde angefragt hat für den Zeitraum verfügbar ist. Der Kunde gibt ein Anreise und ein Abreisedatum an.

Hier weiss ich nicht so recht wie ich vorgehen soll bzw. wie ich eine Zimmerkategorie für einen Zeitraum als nicht verfügbar deklarieren kann bzw. einen Kunden zuweisen kann.

2) Wenn man mehr als 3 Tage ein Zimmer bucht, bekommt man 5 Euro Rabat pro Tag
Auch hier wieder das Problem, dass ich nicht weiss wie ich das mit dem Zeitraum hinbekomme.


Der GregorianCalendar ist mir bekannt und auch dass ich dort ein Anfags- bzw. Enddatum setzen kann, aber nicht wie ich mit Hilfe dessen testen kann ob in diesem Zeitraum etwas frei. Kann man das vl. irgendwie mit einer boolischen Variablen kombinieren, die jeden freien Tag auf ture und jeden gebuchten auf false setzt?

Danke für die Mühe
Gruß
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Nur als Denkanstöße:

- nimm lieber die neue Date-API, zb LocalDate
- Jedes Zimmer hat mehrere Buchungen, diese haben jeweils ein Start- und ein Enddatum
- damit ein Zimmer verfügbar ist, darf kein Buchungs-Start- oder Enddatum zwischen dem Start- und Enddatum liegen, welche angefragt werden
- das zweite Problem kannst du genauso wie das Erste zB mit einer Klasse Buchung lösen
 

javac-

Mitglied
die habe ich auch gefunden, nur finde ich nicht den richtigen Algrorithmus dafür. Ich habe jetzt z.B. ein Array mit Zwei Buchungen, die jeweils ein Anfangs und EndDatum haben. Ich will nun prüfen ob das Zimmer durch eine 3. Anfrage frei ist.

1.Buchung vom 01-07.04.2016
2.Buchung vom 08-15.04.2016

3. Buchung = Anfrage vom 14.-20.04.2016

olgende Methode (in der Klasse Zimmer) soll prüfen ob das Anfragedatum frei ist




Java:
public boolean isVerfügbar(Buchung b1) {

 
     for(Buchung c : this.arr){   //arr ist das Array mit den 2 vorh. Buchungen
    
     //Es gibt ja 2. Fälle die zu einem True-Erg. führen, entweder das zu vergl.
     //Datum liegt komplett vor dem angefragtem oder das
    //zu vergl. Datum liegt komplett hinter dem angefragtem, ansonsten
    //überschneiden sie sich ja, da wollte ich mit folgender if-Bedingung ausdrücken
    //der erste Teil bis zum || sollte prüfen ob das komp. Datum danach liegt
    // und der Teil danach ob das komplette Datum davor liegt
    // nur funktionierts nicht so wie ich mir das vorstelle

       if((b1.getStart().after(c.getStart()) && b1.getStart().after(c.getEnd()) &&b1.getEnd().after(c.getStart()) && b1.getEnd().after(c.getEnd()))
         || (b1.getStart().before(c.getStart()) && b1.getStart().before(c.getEnd()) && b1.getEnd().before(c.getStart()) && b1.getEnd().before(c.getEnd()))){
     
         return true;
       }
   
     }
 
     return false;
   }

Die Methode sollte eig. false liefern, da sich die 2. und 3. Buchung überschneiden, ich erhalte aber true
Das Problem ist, da der erste Teil der if-Bedingung schon wahr ist liefert er mir ein True
 
Zuletzt bearbeitet:

javac-

Mitglied
Ich glaube jetzt habe ich es. Mit mehreren versch. Daten kam das richtige Erg.

Java:
public boolean isVerfügbar(Buchung b1) {

    
     for(Buchung c : this.arr){
      
       if(!(b1.getStart().after(c.getStart()) && b1.getStart().after(c.getEnd()) &&b1.getEnd().after(c.getStart()) && b1.getEnd().after(c.getEnd()))
        && !(b1.getStart().before(c.getStart()) && b1.getStart().before(c.getEnd()) && b1.getEnd().before(c.getStart()) && b1.getEnd().before(c.getEnd()))){
        
         return false;
        
        
       }
      
     }
    
     return true;
   }

kann aber auch einfach sein, dass ich schon zu lange davor sitze. Schau mir das morgen nochmal an
 

Flown

Administrator
Mitarbeiter
Wann ist eine Buchung verfügbar? Wenn der Start- und der Endtag nicht in einem Intervall eines anderen liegt oder? (Wenn das Enddatum inklusive ist)
Java:
public boolean isAvailable(Buchung b) {
  for (Buchung buchung : buchungen) {
    LocalDate start = buchung.getStart();
    LocalDate end = buchung.getEnd();
    if (isBetween(start, end, b.getStart()) && isBetween(start, end, b.getEnd()) && !isBetween(b.getStart(), b.getEnd(), start)) {
      return false;
    }
  }
  return true;
}

private static boolean isBetween(LocalDate start, LocalDate end, LocalDate date) {
  return start.compareTo(date) <= 0 && end.compareTo(date) >= 0;
}
 
Zuletzt bearbeitet:

Meniskusschaden

Top Contributor
damit ein Zimmer verfügbar ist, darf kein Buchungs-Start- oder Enddatum zwischen dem Start- und Enddatum liegen, welche angefragt werde
Ich glaube, das ist nicht ganz korrekt, denn wenn der bereits gebuchte Zeitraum vor dem angefragten Zeitraum beginnt und danach endet, würde das Zimmer als frei gelten.
Mir scheint es am einfachsten zu sein, zu prüfen, ob Endedatum1 vor Beginndatum2 oder Endedatum2 vor Beginndatum1 liegt. Wenn eine der Bedingungen zutrifft, ist das Zimmer frei.
 

Meniskusschaden

Top Contributor
Ich habe die Logik noch mal von "isBetween" auf "overlaps" umgestellt, weil mir das etwas geradliniger erscheint.
Java:
    public static boolean isAvailable(Buchung anfrage) {
        for (Buchung buchung : buchungen) {
            if (overlaps(anfrage, buchung)) {
                return false;
            }
        }
        return true;
    }
  
    private static boolean overlaps(Buchung b1, Buchung b2) {
        return b1.getEnd().isAfter(b2.getStart()) && b2.getEnd().isAfter(b1.getStart());
    }
 

klauskarambulut

Bekanntes Mitglied
Sehr schöne @Meniskusschaden aber ist das auch korrekt.

Aber das Beispiel ist dennoch hervorragend um für TDD zu werben.

Schreibe doch einfach mal Tests! Es gibt folgende Fälle, wenn ich keinen übersehen habe und eine Buchung korrekt ist.
• Anfrage Ende vor Buchung Start
• Anfrage Ende == Buchung Start
• Anfrage Start == Buchung Start und Anfrage Ende vor Buchung Ende
• Anfrage Start == Buchung Start und Anfrage Ende == Buchung Ende
• Anfrage Start == Buchung Start und Anfrage Ende nach Buchung Ende
• Anfrage Start nach Buchung Start und Anfrage Ende vor Buchung Ende
• Anfrage Start nach Buchung Start und Anfrage Ende == Buchung Ende
• Anfrage Start nach Buchung Start und Anfrage Ende nach Buchung Ende
• Anfrage Start == Buchungs Ende
• Anfrage Start nach Buchung Ende

Oder zumindest mal auf dem Papier was dabei herauskommen soll
 

Meniskusschaden

Top Contributor
Aber das Beispiel ist dennoch hervorragend um für TDD zu werben.
Ja, das stimmt, aber für echtes TDD hätte ich die Tests ja eigentlich vorher schreiben müssen und ich bin viel zu ehrlich, um TDD vorzutäuschen (übersetzt: zu faul):D.

Ich finde die Überlappungsbedingung aus meinem Beispiel beim ersten Betrachten übrigens nicht so anschaulich. Hier ist sie noch einmal:
Java:
b1.getEnd().isAfter(b2.getStart()) && b2.getEnd().isAfter(b1.getStart())
Folgende Bedingung wäre dagegen intuitiv relativ schnell verständlich (so hatte ich es in meinem ersten Posting verbal formuliert):
Java:
!(b1.getEnd().isBeforeOrEqual(b2.getStart()) || b2.getEnd().isBeforeOrEqual(b1.getStart()))
Leider enthält LocalDate keine Methode isBeforeOrEqual(), so dass ich es zunächst zu folgender Bedingung umgeformt habe (compareTo finde ich immer etwas verwirrend):
Java:
!(!b1.getEnd().isAfter(b2.getStart()) || !b2.getEnd().isAfter(b1.getStart()))
Das habe ich dann schließlich zum bereits geposteten Ausdruck vereinfacht. Da mein ursprünglicher Ausdruck relativ leicht verständlich ist und die Umformungen ohne Nachdenken schematisch durchgeführt werden können, bin ich sehr zuversichtlich, aber nicht absolut sicher, dass es korrekt ist. Nach genauerer Betrachtung finde ich auch den endgültigen Ausdruck plausibel, aber ich glaube nicht, dass ich so schnell direkt darauf gekommen wäre.
 

Meniskusschaden

Top Contributor
@Meniskusschaden du kannst bei Localdate einfach LocalDate::compareTo verwenden, dann hast du dein <= oder >=.
Ja, das stimmt. Bei compareTo wird mir aber immer schwindelig, weil ich beim Vergleich mit 0 dauernd verdrehe, welcher Wert nun kleiner als welcher ist (hoffentlich ist das keine neurale Dysfunktion:(). Deshalb hatte ich oben schon folgendes angemerkt:;)
(compareTo finde ich immer etwas verwirrend)
 

javac-

Mitglied
also ich habe jetzt mal meinen Code aus post #6 mit allen möglichen Konstellationen die mir eingefallen sind getestet und es kam immer das Richtige heraus.
Falls jemand ein Gegenbeispiel findet bzw. die Richtigkeit bestätigen kann bin ich sehr dankbar.
Java:
public boolean isVerfügbar(Buchung b1) {


     for(Buchung c : this.arr){
  
      //Wenn der Zeitraum der Anfrage (hier b1) nicht komplett nach dem
      // schon gebuchten Zeitraum c und auch nicht komplett vor dem schon
      //gebuchten Zeitraum c ist, dann müssen sie sich irgendwo überlappen
      //und somit false liefern
       if(!(b1.getStart().after(c.getStart()) && b1.getStart().after(c.getEnd()) &&b1.getEnd().after(c.getStart()) && b1.getEnd().after(c.getEnd()))
        && !(b1.getStart().before(c.getStart()) && b1.getStart().before(c.getEnd()) && b1.getEnd().before(c.getStart()) && b1.getEnd().before(c.getEnd()))){
   
         return false;
   
   
       }
 
     }
     //ansonsten überlappen sie sich nirgends und es wird true geliefert
     return true;
   }

Gruß
 
Zuletzt bearbeitet:

Meniskusschaden

Top Contributor
Die Bedingung ist schon ziemlich komplex und schwer zu lesen. Deshalb bin ich nicht sicher, ob meine Vermutung stimmt, dass das Ergebnis falsch ist, falls Abreise eines Gastes und Anreise des nächsten Gastes am selben Tag sind. Das ist in der Praxis ja möglich.

Was macht dein Programm bei folgendem Beispiel: Gast1 hat vom 01.05.2016 bis zum 31.05.2016 gebucht. Gast2 fragt für den Zeitraum vom 25.04.2016 bis 01.05.2016 an und Gast3 für den Zeitraum vom 31.05.2016 bis 01.06.2016. Eigentlich müssten doch beiden Anfragen zugesagt werden können. Mein Verdacht ist, dass dein Programm beiden Anfragen absagt.
 

javac-

Mitglied
ja die werden abgesagt, daran hab ich gar nicht gedacht...das könnte man aber doch beheben, indem man zu den start bzw. end Zeiten des Anfragezeitraums noch ein || .quals() hängt.
Also z.B. (...isbefore(c.getstart()) || ...isquals(c.getstart()))
wird dann halt noch um einiges unübersichtlicher als es onehin schon ist.
 

javac-

Mitglied
so jetzt habe ich das Problem auch gelöst durch 2. mal einfügen von ||.equals
Nun werden auch Daten die sich nur am selben Tag überlappen als true dargestellt.

Wenn sich der Startzeitpunkt des Anfragezeitraums mit dem Endzeitpunkt gleicht oder wenn der Endzeitpunkt des Anfragezeitraums mit dem Anfangszeitpunkt gleicht
Java:
if(!(b1.getStart().after(c.getStart()) && (b1.getStart().after(c.getEnd())|| b1.getStart().equals(c.getEnd())) &&b1.getEnd().after(c.getStart()) && b1.getEnd().after(c.getEnd()))
        && !(b1.getStart().before(c.getStart()) && b1.getStart().before(c.getEnd()) && (b1.getEnd().before(c.getStart())||b1.getEnd().equals(c.getStart()) ) && b1.getEnd().before(c.getEnd()))){

Vielen Dank für deinen Hinweis darauf ;-)
 

Meniskusschaden

Top Contributor
Ich glaube, bei meinem Beispiel aus Post#16 würde Gast2 jetzt zwar eine Zusage bekommen, Gast3 aber nicht. Das war jetzt ein schnell umgebauter Test für meine Posts von vorgestern. Kann also auch sein, dass ich beim Umbauen einen Fehler gemacht habe, aber ich würde den Fall lieber noch einmal testen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Tool Tipp für Radio Button Java Basics - Anfänger-Themen 3
Binary.Coder Tipp für Ein-/Ausgabe für Dijkstra Java Basics - Anfänger-Themen 6
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
F Toto-Tipp-Reihen berechnen Java Basics - Anfänger-Themen 1
J Tipp: Informativere Debug-Meldungen ausgeben Java Basics - Anfänger-Themen 4
maddin86 Zahlenausgabe- bräuchte einen Tipp Java Basics - Anfänger-Themen 11
M Code aus IntelliJ in "Textform" für Word-Paper? Java Basics - Anfänger-Themen 10
G Icon für App Java Basics - Anfänger-Themen 1
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
V Durchschnittliche Volatility in Prozent für 4 Stunden berechnen Java Basics - Anfänger-Themen 14
P Welches SDK für das erstellen einer ausführbaren Datei? Java Basics - Anfänger-Themen 4
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
D Apache HTTPClient für alle Fälle Java Basics - Anfänger-Themen 41
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
J Fehlermeldung unverständlich für Jakarta Java Basics - Anfänger-Themen 17
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
M GUI für Vier-Gewinnt. Java Basics - Anfänger-Themen 4
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
Ostkreuz Counter für Booleanwerte Java Basics - Anfänger-Themen 8
B Regex Ausdrücke für Monate Java Basics - Anfänger-Themen 7
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
Jxhnny.lpz Randomisier für Buttons Java Basics - Anfänger-Themen 13
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
M "Class<T> clazz" im Constructor - auch für int möglich? Java Basics - Anfänger-Themen 7
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
M generate Methode für Streams Java Basics - Anfänger-Themen 6
I Datenmodell für "Tags" Java Basics - Anfänger-Themen 6
Lion.King for-Kontrollstruktur für Pyramide Java Basics - Anfänger-Themen 8
B Mit Countdown Midnestdauer für Teilaufgabenerledigung erzwingen Java Basics - Anfänger-Themen 8
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
K Spieleidee gesucht für Informatikprojekt - JAVA (BlueJ)? Java Basics - Anfänger-Themen 15
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
javamanoman Java für Online Banking Java Basics - Anfänger-Themen 12
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
JordenJost Java ist auch eine Insel für Anfänger Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
I SQL / JPA Query für StartDate und EndDate Java Basics - Anfänger-Themen 1
T getMethode für ein Array Java Basics - Anfänger-Themen 2
Fats Waller Farben mixen für den Hintergrund ? Java Basics - Anfänger-Themen 1
H Suche jemanden für kleine Uni-Abgabe/ mit Vergütung Java Basics - Anfänger-Themen 1
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
N Api nur für Textdatein (.txt) Java Basics - Anfänger-Themen 2
bluetrix Programmieren eines Bots für Zahlen-Brettspiel Java Basics - Anfänger-Themen 9
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
R Ist Java das Richtige für mich? Java Basics - Anfänger-Themen 4
E Mittelquadratmethode für Hexadezimalzahlen Java Basics - Anfänger-Themen 1
P Einfacher regulärer Ausdruck (RegEx) für E-Mail-Adressen Java Basics - Anfänger-Themen 2
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4
S BubbleSort für ArrayLists Java Basics - Anfänger-Themen 3
T Übungsbuch für Anfänger Java Basics - Anfänger-Themen 3
L Konzept für Quiz Java Basics - Anfänger-Themen 33
D Methoden Plathhalter für Integer in einer Methode Java Basics - Anfänger-Themen 19
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
Aqtox Hallo ich muss für die Schule ein Wuerfell Duell erstellen jedoch habe ich ein fehler Java Basics - Anfänger-Themen 4
L loop für Namen Java Basics - Anfänger-Themen 11
kxrdelis Konstruktor für ein Rechtwinkliges Dreieck Java Basics - Anfänger-Themen 10
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
nevel Programm für die Summer der Zahlen 1- 1ß Java Basics - Anfänger-Themen 12
I Entity erstellen, die für API gedacht ist Java Basics - Anfänger-Themen 33
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
Animal-Mother BMI Rechner erstellen für W/M Java Basics - Anfänger-Themen 7
E Kleines Java-Projekt für Anfänger Java Basics - Anfänger-Themen 10
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
I DecimalFormat in Zahlenformat für Währung, habe 7,99, bekomme aber 7 Java Basics - Anfänger-Themen 4
L Methode für Zweidimensionale Arrays Java Basics - Anfänger-Themen 4
Kanaska Datentyp für Zahlenbereiche Java Basics - Anfänger-Themen 7
T Startbildschirm für ein Spiel erstellen Java Basics - Anfänger-Themen 0
U BestPractise für Deployment unter Windows gesucht Java Basics - Anfänger-Themen 12
lilrack UML Diagramm für Parkplatzverwaltung Java Basics - Anfänger-Themen 8
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
B Generische Typen für dynamisches Formular Java Basics - Anfänger-Themen 3
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
T Start-Activity für Java Maven Web-Anwendung festlegen Java Basics - Anfänger-Themen 2
T Alternative für switch case Java Basics - Anfänger-Themen 1
P Ressourcen für JSON & API Informationen? Java Basics - Anfänger-Themen 1
M Java Einstellung von Apache POI für MS Word Erstellung mit Eclipse Java Basics - Anfänger-Themen 6
L Compiler-Fehler SupressWarning für clone() Java Basics - Anfänger-Themen 6
P Wie für EIN Java Programm von 64bit Java (=Standard) auf 32bit Java Installation (Windows) umschalten? Java Basics - Anfänger-Themen 6
B Methode für jede beliebe Entity erstellen Java Basics - Anfänger-Themen 7
D Ampel für Mitarbeiter zum An-/Abwesend zeigen Java Basics - Anfänger-Themen 28
T Wahrscheinlichkeiten für Slot Machine Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben