From 07a48dba0d02010eda20621ab108842338ef52fa Mon Sep 17 00:00:00 2001 From: dustineversmann Date: Mon, 7 Oct 2024 23:36:50 +0200 Subject: [PATCH] =?UTF-8?q?Anpassen=20der=20Logik,=20die=20Berechnung=20de?= =?UTF-8?q?s=20Preises=20ist=20wirklich=20grauenhaft,=20wenn=20man=20es=20?= =?UTF-8?q?richtig=20machen=20m=C3=B6chte?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/de/deversmann/Auto.java | 48 ++++++----- src/main/java/de/deversmann/Main.java | 87 +++++++++++++++++--- src/main/java/de/deversmann/Parkhaus.java | 98 ++++++++++++++++++++--- 3 files changed, 190 insertions(+), 43 deletions(-) diff --git a/src/main/java/de/deversmann/Auto.java b/src/main/java/de/deversmann/Auto.java index 4d4bcde..76b2005 100644 --- a/src/main/java/de/deversmann/Auto.java +++ b/src/main/java/de/deversmann/Auto.java @@ -1,50 +1,46 @@ package de.deversmann; -import java.util.Calendar; -import java.util.Date; + public class Auto { + public Auto(String kennzeichen) { this.kennzeichen = kennzeichen; - this.einfahrtZeit = new Date(); - this.bezahlt = false; - this.ausfahrtZeit = new Date(); - this.bezahlZeit = new Date(); + this.einfahrtZeit = einfahrtZeit; + this.bezahlt = bezahlt; + this.ausfahrtZeit = ausfahrtZeit; + this.eAuto = iseAuto(); } - private Calendar calendar = Calendar.getInstance(); + private final String kennzeichen; - private Date einfahrtZeit; - private Date bezahlZeit; - private Date ausfahrtZeit; + private String einfahrtZeit; + + private String ausfahrtZeit; private boolean bezahlt; + private boolean eAuto; public String getKennzeichen() { return kennzeichen; } - public Date getEinfahrtZeit() { + public void setEinfahrtZeit(String einfahrtZeit) { + this.einfahrtZeit = einfahrtZeit; + } + public String getEinfahrtZeit() { return einfahrtZeit; } - public void setEinfahrtZeit() { - this.einfahrtZeit = calendar.getTime() ; - } - public Date getBezahlZeit() { - return bezahlZeit; - } - public void setBezahlZeit(Date bezahlZeit) { - this.bezahlZeit = bezahlZeit; - } - public Date getAusfahrtZeit() { + + public String getAusfahrtZeit() { return ausfahrtZeit; } - public void setAusfahrtZeit(Date ausfahrtZeit) { + public void setAusfahrtZeit(String ausfahrtZeit) { this.ausfahrtZeit = ausfahrtZeit; } @@ -55,4 +51,12 @@ public class Auto { public void setBezahlt(boolean bezahlt) { this.bezahlt = bezahlt; } + + public boolean iseAuto() { + + return eAuto = kennzeichen.endsWith("E"); + + } + + } diff --git a/src/main/java/de/deversmann/Main.java b/src/main/java/de/deversmann/Main.java index 41b8e58..8daaf46 100644 --- a/src/main/java/de/deversmann/Main.java +++ b/src/main/java/de/deversmann/Main.java @@ -1,20 +1,87 @@ package de.deversmann; +import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Date; +import java.time.Duration; +import java.time.LocalTime; +import java.util.*; -//TIP To Run code, press or -// click the icon in the gutter. public class Main { - public static void main(String[] args) { - + public static void main(String[] args) throws ParseException { Parkhaus parkhaus = new Parkhaus(); - Auto auto1 = new Auto("D-DL-2023"); - System.out.println(parkhaus.isGeöffnet()); - System.out.println(auto1.getEinfahrtZeit()); - var sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); - System.out.println(sdf.format(new Date())); + HashMap autos = new HashMap<>(); + boolean schleife = true; + Scanner scanner = new Scanner(System.in); + var sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); + sdf.setLenient(false); + + Auto test = new Auto("123E"); + test.setEinfahrtZeit("10.10.2000, 05:00"); + test.setAusfahrtZeit("11.10.2000, 13:00"); + System.out.println(parkhaus.berechnePreis(test)); + + while (schleife) { + + + System.out.println("Willkommen im Parkhaus Eversmann"); + + System.out.println("Bitte wählen Sie durch Eingabe der Zahl aus:"); + System.out.println("1. Einfahrt"); + System.out.println("2. Kosten prüfen"); + System.out.println("3. Ausfahren"); + System.out.println("4. Bezahlen und ausfahren"); + System.out.println("5. Geparkte Autos anzeigen"); + System.out.println("6. Beenden"); + int auswahl = Integer.parseInt(scanner.nextLine()); + + if (auswahl == 1) { + System.out.println("Bitte geben Sie ihr Kennzeichen ein: Format (MA-DL 1234) oder (MA-DL 1234E)"); + String kennzeichen = scanner.nextLine(); + System.out.println("Bitte geben Sie ihre Einfahrtszeit ein: Format (dd.MM.yyyy, HH:mm) (12.12.2023, 10:12)"); + String einfahrtsZeit = scanner.nextLine(); + /*if (autos.containsKey(kennzeichen)) { + + }*/ + autos.put(kennzeichen, new Auto(kennzeichen)); + autos.get(kennzeichen).setEinfahrtZeit(einfahrtsZeit); + } else if (auswahl == 2) { + + Auto gewünschtesAuto = parkhaus.getAutoFromKennzeichen(autos); + + System.out.println("Der Preis für das eingegebene Kennzeichen \n" + gewünschtesAuto.getKennzeichen() + "\n" + "ist " + parkhaus.berechnePreis(gewünschtesAuto) + "€"); + + } else if (auswahl == 3) { + parkhaus.ausfahren(autos); + System.out.println("Vielen Dank für Ihr Vertrauen"); + } else if (auswahl == 4) { + + Auto ausgefahrenensAuto = parkhaus.ausfahren(autos); + parkhaus.bezahlePreisFürKennzeichen(ausgefahrenensAuto); + } + else if (auswahl == 5) { + + for (Auto auto : autos.values()) { + if (auto.getAusfahrtZeit().isBlank()){ + System.out.println(auto); + } + } + + } + else if (auswahl == 6) { + schleife = false; + System.out.println("Auf Wiedersehen"); + } + + if (schleife){ + System.out.println("Weitermachen?"); + String weiter = scanner.nextLine(); + if (weiter.equals("")) { + schleife = false; + } + } + + } } } \ No newline at end of file diff --git a/src/main/java/de/deversmann/Parkhaus.java b/src/main/java/de/deversmann/Parkhaus.java index 3ddcee9..2e298d8 100644 --- a/src/main/java/de/deversmann/Parkhaus.java +++ b/src/main/java/de/deversmann/Parkhaus.java @@ -4,17 +4,19 @@ package de.deversmann; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Duration; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; +import java.util.*; public class Parkhaus { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); + Scanner scanner = new Scanner(System.in); private boolean geöffnet; private int anzahlParkplätze; - - private int parkdauer; + private final double ANGEFANGENE_STUNDE_PREIS = 1.00; + private final double TAGES_MAX_PREIS = 15.00; + private final double NACHT_MAX_PREIS = 5.00; + private final double E_AUTO_RABATT = 0.8; + private final int FREIE_MINUTEN = 15; private int belegteParkplätze; private double kosten; @@ -74,23 +76,97 @@ public class Parkhaus { } - public ArrayList berechneParkdauer(String einfahrtZeit, String ausfahrZeit){ - String dauer = ""; + public ArrayList berechneParkdauer(String einfahrtZeit, String ausfahrZeit) { ArrayList parkdauer = new ArrayList(); + simpleDateFormat.setLenient(false); try { Date einfahrtZeitDate = simpleDateFormat.parse(einfahrtZeit); Date ausfahrZeitDate = simpleDateFormat.parse(ausfahrZeit); - Duration duration = Duration.ofMillis(Math.abs(ausfahrZeitDate.getTime()-einfahrtZeitDate.getTime())); + Duration duration = Duration.ofMillis(Math.abs(ausfahrZeitDate.getTime() - einfahrtZeitDate.getTime())); long days = duration.toDays(); long hours = duration.toHours() % 24; long minutes = duration.toMinutes() % 60; - dauer = "Parkdauer:" + days + " Tage " + hours + " Stunden " + minutes + " Minuten "; - Collections.addAll(parkdauer,days,hours,minutes); + + Collections.addAll(parkdauer, days, hours, minutes); } catch (ParseException e) { - System.out.println("Fehler beim Parsen der Daten"+ e.getMessage()); + System.out.println("Fehler beim Parsen der Daten" + e.getMessage()); } return parkdauer; } + + public double berechnePreis(Auto auto) throws ParseException { + double preis = 0; + simpleDateFormat.setLenient(false); + Date einfahrtZeitDate = simpleDateFormat.parse(auto.getEinfahrtZeit()); + Date ausfahrtZeitDate = simpleDateFormat.parse(auto.getAusfahrtZeit()); + int einfahrtStunde = einfahrtZeitDate.getHours(); + int ausfahrtStunde = ausfahrtZeitDate.getHours(); + long parkdauerInMinuten = (ausfahrtZeitDate.getTime() - einfahrtZeitDate.getTime()) / (60 * 1000); + + if (parkdauerInMinuten < FREIE_MINUTEN) { + return 0; + } + + long kostenpflichtigeMinuten = parkdauerInMinuten - FREIE_MINUTEN; + double kostenPflichtigeStunden = Math.ceil(kostenpflichtigeMinuten / 60); + + long parkdauerInTagen = (long) Math.ceil(parkdauerInMinuten / (60.0 * 24)); + + if (parkdauerInTagen >= 1) { + long kostenpflichtigeGanzeTage = (long) Math.floor(kostenPflichtigeStunden / 24); + preis = kostenpflichtigeGanzeTage * TAGES_MAX_PREIS; + long übrigenStunden = (long) (kostenPflichtigeStunden - kostenpflichtigeGanzeTage * 24); + if (übrigenStunden <= 5) { + preis = preis + (übrigenStunden * ANGEFANGENE_STUNDE_PREIS); + } else if (einfahrtStunde >= 20) { + long stundenImAltenTag = (einfahrtStunde + übrigenStunden) - 24; + long stundenImNeuenTag = übrigenStunden - stundenImAltenTag; + if (stundenImNeuenTag <= 5) { + preis += 5; + } else { + preis += 5 + stundenImNeuenTag - 5; + } + + } else if (einfahrtStunde <= 5) { + long angebrocheneStundenAusserhalbDerNacht = (long) 6 - einfahrtStunde; + long übrigeStundenAusserhalb = (long) Math.abs(einfahrtStunde - 6); + if (angebrocheneStundenAusserhalbDerNacht == 6) { + preis += 5; + } else { + preis += 5 + übrigeStundenAusserhalb; + } + } + } + + if (auto.iseAuto()) { + preis = preis * E_AUTO_RABATT; + } + + + return preis; + } + + public Auto getAutoFromKennzeichen(HashMap autos) { + System.out.println("Bitte gib dein Kennzeichen ein: Format (MA-DL 1234) oder (MA-DL 1234E)"); + String kennzeichen = scanner.nextLine(); + Auto gewünschtesAuto = autos.get(kennzeichen); + return gewünschtesAuto; + } + + public Auto ausfahren(HashMap autos) { + + Auto ausfahrendesAuto = getAutoFromKennzeichen(autos); + System.out.println("Bitte geben Sie ihre Ausfahrtzeit an: Format (dd.MM.yyyy, HH:mm)"); + String ausfahrtZeit = scanner.nextLine(); + ausfahrendesAuto.setAusfahrtZeit(ausfahrtZeit); + return ausfahrendesAuto; + + } + + public Auto bezahlePreisFürKennzeichen(Auto zuBezahlendesAuto) { + zuBezahlendesAuto.setBezahlt(true); + return zuBezahlendesAuto; + } }