Verbesserungen an code Und die Methode berechneParkgebuehren

implementiert mit einem junit Test
main
3009594 2024-10-04 20:29:04 +02:00
parent 9cc877e0e9
commit 8be136b83a
9 changed files with 239 additions and 107 deletions

View File

@ -39,3 +39,69 @@ Frage 2:
Math.ceil(2.1); // Ausgabe: 3.0 Math.ceil(2.1); // Ausgabe: 3.0
Math.ceil(3.7); // Ausgabe: 4.0 Math.ceil(3.7); // Ausgabe: 4.0
Math.ceil(1.01); // Ausgabe: 2.0 Math.ceil(1.01); // Ausgabe: 2.0
-------------------------------------------------------------------------------------------------------------------
Frage 3:
Ich : die Methode getTime gibt die Zeit in stunden und Minuten??
ChatGPT:
Die Methode getTime() in Java gibt nicht direkt die Stunden und Minuten aus. Stattdessen gibt sie die Zeit als Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 UTC zurück (Unix-Zeit). Du kannst diese Millisekunden dann verwenden, um die Differenz zwischen zwei Date-Objekten zu berechnen, wie in deinem Fall geschehen.
Um explizit die Stunden und Minuten aus einem Date-Objekt zu bekommen, kannst du entweder die Calendar-Klasse oder die SimpleDateFormat-Klasse verwenden. Hier sind zwei Möglichkeiten:
1. Mit Calendar
java
Code kopieren
Calendar cal = Calendar.getInstance();
cal.setTime(deinDateObjekt);
int stunden = cal.get(Calendar.HOUR_OF_DAY); // Stunden im 24-Stunden-Format
int minuten = cal.get(Calendar.MINUTE); // Minuten
2. Mit SimpleDateFormat
Falls du die Stunden und Minuten als String brauchst, kannst du SimpleDateFormat benutzen:
java
Code kopieren
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
String zeit = sdf.format(deinDateObjekt); // Zeit als String "HH:mm"
Zusammengefasst:
getTime() gibt die Millisekunden seit 1970 zurück, nicht direkt Stunden und Minuten.
Um Stunden und Minuten zu extrahieren, musst du entweder Calendar verwenden oder die Ausgabe mit SimpleDateFormat formatieren.
In deinem Fall, wenn du die Stunden und Minuten für Ein- und Ausfahrt benötigst, würde ich dir empfehlen, entweder Calendar zu verwenden oder mit SimpleDateFormat die Zeit zu formatieren, um Klarheit zu schaffen.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Frage 4:
Ich: var sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
Date d1 = sdf.parse("01.10.2024, 14:00");
Date d2 = sdf.parse("01.10.2024, 15:30");
System.out.println( d1.getHours());
warum wurde die Methode .getHours() durchgestrichen ??
cahtGPT: Die Methode getHours() der Klasse Date ist durchgestrichen, weil sie als veraltet (deprecated) gilt. Java hat entschieden, diese Methode zu entwerten, weil die Date-Klasse in ihrer ursprünglichen Form als unflexibel und fehleranfällig angesehen wurde. Stattdessen empfiehlt Java, modernere Klassen wie Calendar oder die Klassen aus dem java.time-Paket (z. B. LocalDateTime, ZonedDateTime) zu verwenden.
Die veralteten Methoden wie getHours(), getMinutes(), und getSeconds() wurden durch leistungsfähigere und flexiblere APIs ersetzt, die besser mit Zeitzonen und Internationalisierung umgehen können.
Alternative Lösung:
Anstatt getHours() zu verwenden, solltest du Calendar oder die neuen Zeit-API-Klassen verwenden. Hier ist eine Möglichkeit, die Stunde mithilfe von Calendar zu bekommen:
Mit Calendar:
java
Code kopieren
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
Date d1 = sdf.parse("01.10.2024, 14:00");
Calendar cal = Calendar.getInstance();
cal.setTime(d1);
int hours = cal.get(Calendar.HOUR_OF_DAY); // Stunden im 24-Stunden-Format
System.out.println(hours); // Ausgabe: 14
Mit java.time.LocalDateTime (empfohlene Methode ab Java 8):
Java 8 und höher bietet das java.time-Paket, das viel leistungsfähiger ist und besser mit Datum und Zeit umgeht.
java
Code kopieren
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy, HH:mm");
LocalDateTime dateTime = LocalDateTime.parse("01.10.2024, 14:00", formatter);
int hours = dateTime.getHour();
System.out.println(hours); // Ausgabe: 14
Fazit:
Vermeide die Verwendung der veralteten getHours()-Methode und nutze entweder Calendar oder, noch besser, die java.time-API, die in Java 8

View File

@ -14,7 +14,7 @@ import java.util.Date;
public class Fahrzeug { public class Fahrzeug {
private final String kennzeichen; private final String kennzeichen;
private final Date einfahrt; private Date einfahrt;
private Date ausfahrt; private Date ausfahrt;
private boolean bezahlt; private boolean bezahlt;
private int betrag; private int betrag;

View File

@ -1,7 +0,0 @@
package Parkhaus;
public class Gebuehrenberechnen {
// Hier werde ich die Parkgebühren behandlen
}

View File

@ -15,7 +15,7 @@ class JTest_Einfahren {
@Test @Test
public void testEinfahrenOhneEingabe() throws ParseException { public void testEinfahrenOhneEingabe() throws ParseException {
parkhaus.einfahrenextern("", ""); parkhaus.einfahren("", "");
assertEquals(179, parkhaus.getMaxPlaetze()); assertEquals(179, parkhaus.getMaxPlaetze());
} }
@ -23,8 +23,7 @@ class JTest_Einfahren {
public void testEinfahrenMitEingabe() throws ParseException { public void testEinfahrenMitEingabe() throws ParseException {
String kennzeichen = "MA-SH 4077"; String kennzeichen = "MA-SH 4077";
String einfahrtzeit = "01.10.2024, 14:30"; String einfahrtzeit = "01.10.2024, 14:30";
String test = parkhaus.einfahren(kennzeichen, einfahrtzeit);
String test = parkhaus.einfahrenextern(kennzeichen, einfahrtzeit);
assertTrue(test.contains(kennzeichen)); assertTrue(test.contains(kennzeichen));
assertTrue(test.contains(einfahrtzeit)); assertTrue(test.contains(einfahrtzeit));
assertEquals(179, parkhaus.getMaxPlaetze()); assertEquals(179, parkhaus.getMaxPlaetze());

View File

@ -0,0 +1,59 @@
package Parkhaus;
import static org.junit.jupiter.api.Assertions.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class JTest_berechneParkgebuehren {
private Parkhaus parkhaus;
private SimpleDateFormat sdf;
@BeforeEach
void start() throws ParseException {
parkhaus = new Parkhaus();
sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
}
@Test
public void test_berechneParkgebuehren() throws ParseException, AutoNichtGefundenException {
String kennzeichen = "MA-SH 4077";
String einfahrt = "01.10.2024, 14:30";
String ausfahrt = "01.10.2024, 14:45";
parkhaus.einfahren(kennzeichen, einfahrt);
// 15 Minuten => True
assertEquals(0,parkhaus.berechneParkgebuehren(kennzeichen, ausfahrt));
// 16 Minuten => True
einfahrt = "01.10.2024, 14:30";
ausfahrt = "01.10.2024, 14:46";
assertEquals(1,parkhaus.berechneParkgebuehren(kennzeichen, ausfahrt));
// 1 Stunde => True
einfahrt = "01.10.2024, 14:30";
ausfahrt = "01.10.2024, 15:30";
assertEquals(1, parkhaus.berechneParkgebuehren(kennzeichen, ausfahrt));
// 2 Stunden => True
einfahrt = "01.10.2024, 14:00";
ausfahrt = "01.10.2024, 16:00";
assertEquals(2, parkhaus.berechneParkgebuehren(kennzeichen, ausfahrt));
// Zwischen 20 bis 6 Uhr => True
einfahrt = "01.10.2024, 22:00";
ausfahrt = "02.10.2024, 04:00";
assertEquals(5, parkhaus.berechneParkgebuehren(kennzeichen, ausfahrt));
}
}

View File

@ -1,11 +1,18 @@
package Parkhaus; package Parkhaus;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main { public class Main {
public static void main(String[] args) throws ParseException { public static void main(String[] args) throws ParseException, AutoNichtGefundenException {
new TextUI();
var sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
Date d1 = sdf.parse("01.10.2024, 14:00");
Date d2 = sdf.parse("01.10.2024, 15:30");
System.out.println( d1.getHours());
} }
} }

View File

@ -3,6 +3,7 @@ package Parkhaus;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
/* Parkhaus klasse /* Parkhaus klasse
@ -23,7 +24,7 @@ public class Parkhaus {
sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
} }
private String einfahrenIntern(String kennzeichen, String einfahrtzeit) throws ParseException { public String einfahren(String kennzeichen, String einfahrtzeit) throws ParseException {
Date einfahrt; Date einfahrt;
Fahrzeug fahrzeug; Fahrzeug fahrzeug;
if (kennzeichen.isEmpty() && einfahrtzeit.isEmpty()) if (kennzeichen.isEmpty() && einfahrtzeit.isEmpty())
@ -42,55 +43,77 @@ public class Parkhaus {
+ fahrzeug.getEinfahrtFormatted() + " im Parkhaus eingefahren."; + fahrzeug.getEinfahrtFormatted() + " im Parkhaus eingefahren.";
} }
public String einfahrenextern(String kennzeichen, String einfahrtzeit) throws ParseException {
return einfahrenIntern(kennzeichen, einfahrtzeit);
public int berechneParkgebuehren(String kennzeichen, String ausfahrtzeit) throws AutoNichtGefundenException, ParseException {
if (kennzeichen.isEmpty()) {
throw new AutoNichtGefundenException("Sie müssen bitte das Kennzeichen Ihres Autos eingeben.");
} }
private int berechneParkgebuehrenIntern(String kennzeichen, String ausfahrtzeit)throws AutoNichtGefundenException, ParseException {
Fahrzeug fahrzeug = findeFahrzeug(kennzeichen); Fahrzeug fahrzeug = findeFahrzeug(kennzeichen);
Date ausfahrt = sdf.parse(ausfahrtzeit);
Date einfahrt = fahrzeug.getEinfahrt(); Date einfahrt = fahrzeug.getEinfahrt();
Date ausfahrt;
long inMinuten = ((ausfahrt.getTime() - einfahrt.getTime()) / 1000 / 60); if (ausfahrtzeit.isEmpty()) {
int inStunden = (int) Math.ceil(inMinuten / 60); // Z.b = 6 Stunden String aktuelleZeitString = sdf.format(new Date());
ausfahrt = sdf.parse(aktuelleZeitString);
} else {
ausfahrt = sdf.parse(ausfahrtzeit);
}
double inMinuten = (ausfahrt.getTime() - einfahrt.getTime()) / 1000.0 / 60.0;
int inStunden = (int) Math.ceil(inMinuten / 60.0);
int maxNachtBetrag = 5; int maxNachtBetrag = 5;
int maxTagBetrag = 15; int maxTagBetrag = 15;
int betrag; int betrag = 0;
// Erstellung von Calendar-Objekten für Einfahrt und Ausfahrt
Calendar calEinfahrt = Calendar.getInstance();
calEinfahrt.setTime(einfahrt);
Calendar calAusfahrt = Calendar.getInstance();
calAusfahrt.setTime(ausfahrt);
int einfahrtStunde = calEinfahrt.get(Calendar.HOUR_OF_DAY);
int ausfahrtStunde = calAusfahrt.get(Calendar.HOUR_OF_DAY);
if (inMinuten <= 15) if (inMinuten <= 15)
betrag = 0; betrag = 0;
else if ((einfahrtStunde < 6 || einfahrtStunde >= 20) || (ausfahrtStunde < 6 || ausfahrtStunde >= 20)) {
betrag = (inStunden <= maxNachtBetrag) ? inStunden : maxNachtBetrag;
System.out.println(betrag);
}
// zwische 20 Uhr und 6 Uhr max 5€
else if (einfahrt.getHours() >= 20 || einfahrt.getHours() < 6 || ausfahrt.getHours() >= 20|| ausfahrt.getHours() < 6)
betrag = Math.min(inStunden, maxNachtBetrag);
else { else {
betrag = inStunden; betrag = inStunden;
if (betrag > maxTagBetrag) {
if (betrag > maxTagBetrag)
betrag = maxTagBetrag; betrag = maxTagBetrag;
} }
}
fahrzeug.setBetrag(betrag); fahrzeug.setBetrag(betrag);
return fahrzeug.getBetrag(); return fahrzeug.getBetrag();
}
public int berechneParkgebuehrenExtern(String kennzeichen, String ausfahrtzeit) throws AutoNichtGefundenException, ParseException {
int betrag = berechneParkgebuehrenIntern(kennzeichen, ausfahrtzeit);
return betrag;
} }
private Fahrzeug findeFahrzeug(String kennzeichen) throws AutoNichtGefundenException {
for (Fahrzeug auto : fahrzeuge)
if (auto.getKennzeichen().equals(kennzeichen))
return auto;
throw new AutoNichtGefundenException("Ihr Auto wurde nicht gefunden. Bitte wenden Sie sich an den Support");
}
public boolean checkParkplatze() { public boolean checkParkplatze() {
return maxPlaetze > 0; return maxPlaetze > 0;
} }
private boolean checkSchulden(String kennzeichen) { public boolean checkSchulden(String kennzeichen) {
for (Fahrzeug sc : fahrzeugeMitSchulden) for (Fahrzeug sc : fahrzeugeMitSchulden)
if (sc.getKennzeichen().equals(kennzeichen)) if (sc.getKennzeichen().equals(kennzeichen))
return true; return true;
@ -98,20 +121,6 @@ public class Parkhaus {
return false; return false;
} }
public boolean checkSchuldenExtern(String kennzeichen) {
return checkSchulden(kennzeichen);
}
public Fahrzeug findeFahrzeug(String kennzeichen) throws AutoNichtGefundenException {
for (Fahrzeug auto : fahrzeuge)
if (auto.getKennzeichen().equals(kennzeichen))
return auto;
throw new AutoNichtGefundenException("Ihre Auto wurde nicht gefunden \n melden Sie sich bitte an die Support");
}
// Getter methoden: // Getter methoden:
public ArrayList<Fahrzeug> getFahrzeuge() { public ArrayList<Fahrzeug> getFahrzeuge() {
return fahrzeuge; return fahrzeuge;

View File

@ -5,16 +5,14 @@ import java.util.Scanner;
public class TextUI { public class TextUI {
private Parkhaus system; private Parkhaus system;
private Scanner eingabe;
TextUI() throws ParseException, AutoNichtGefundenException{
TextUI() throws ParseException{
system = new Parkhaus(); system = new Parkhaus();
startprogramm(); startprogramm();
} }
private void startprogramm() throws ParseException { private void startprogramm() throws ParseException, AutoNichtGefundenException {
eingabe = new Scanner(System.in); Scanner eingabe = new Scanner(System.in);
boolean aktiv = true; boolean aktiv = true;
System.out.println("<<Willkommen im parkhaus 'kiss and ride'>> "); System.out.println("<<Willkommen im parkhaus 'kiss and ride'>> ");
@ -22,15 +20,16 @@ public class TextUI {
System.out.println(); System.out.println();
System.out.println("Bitte Wählen Sie ein Option ein: "); System.out.println("Bitte Wählen Sie ein Option ein: ");
System.out.println("1.Einfahren"); System.out.println("1.Einfahren");
System.out.println("2.Ausfahren"); System.out.println("2. Parkgebühren berechnen lassen");
System.out.println("3. Parkgebühren berechnen und (bezahlen Oder Schulden lassen)"); System.out.println("3. Parkgebühren bezahlen");
System.out.println("4. Beenden"); System.out.println("4.Ausfahren");
System.out.println("5. Beenden");
System.out.print("> "); System.out.print("> ");
String auswhal = eingabe.nextLine(); String auswhal = eingabe.nextLine();
String kennzeichen; String kennzeichen;
String einfahrtzeit; String einfahrtzeit;
String ausfahrtzeit;
switch (auswhal) { switch (auswhal) {
case "1": // Einfahren case "1": // Einfahren
if (!system.checkParkplatze()) if (!system.checkParkplatze())
@ -38,22 +37,30 @@ public class TextUI {
else { else {
System.out.println("geben Sie bitte das Kennzeichen Ihres Autos ein (optional): "); System.out.println("geben Sie bitte das Kennzeichen Ihres Autos ein (optional): ");
kennzeichen = eingabe.nextLine(); kennzeichen = eingabe.nextLine();
if (system.checkSchuldenExtern(kennzeichen)) if (system.checkSchulden(kennzeichen))
System.out.println("Das Auto mit dem Kennzeichen: " + kennzeichen + " ist im Parkhaus mit Schulden eingefahren!" ); System.out.println("Das Auto mit dem Kennzeichen: " + kennzeichen + " ist im Parkhaus mit Schulden eingefahren!" );
System.out.println("geben Sie nun bitte die Einfahrtszeit ein (Optional):"); System.out.println("geben Sie nun bitte die Einfahrtszeit ein (oder lassen Sie das für das System):");
einfahrtzeit = eingabe.nextLine(); einfahrtzeit = eingabe.nextLine();
System.out.println(system.einfahrenextern(kennzeichen, einfahrtzeit)); System.out.println(system.einfahren(kennzeichen, einfahrtzeit));
} }
break; break;
case "2": case "2":
// TODO System.out.println("Geben Sie erneut das Kennzeichnes Ihres Autos an");
kennzeichen = eingabe.nextLine();
System.out.println("Geben Sie bitte die Ausfahrtzeit ein (oder lassen Sie das für das System)");
ausfahrtzeit = eingabe.nextLine();
system.berechneParkgebuehren(kennzeichen, ausfahrtzeit);
break;
case "3": case "3":
// TODO // TODO
break;
case "4": case "4":
// TODO // TODO
break;
case "5":
break;
default: default:
System.out.println("Das war leider keine gültige Eingabe"); System.out.println("Das war leider keine gültige Eingabe");

View File

@ -1,16 +1,20 @@
package Parkhaus; package Parkhaus;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random; import java.util.Random;
import java.util.Set;
/*kennzeichenzufaelliggenerieren: /*kennzeichenzufaelliggenerieren:
* *
* - Diese Klasse hat nur die Aufgabe, zufällige Kennzeichen zu generieren * - Diese Klasse hat nur die Aufgabe, zufällige Kennzeichen zu generieren
* - immer wenn diese Klasse ein zufälliges Kennzeichen generiert, * - immer wenn diese Klasse ein zufälliges Kennzeichen generiert,
* - speichere ich das,damit es nicht für mehrere Autos dasselbe Kennzeichen generiert. * - Hashset verwenden, damit das System nicht für mehrere Autos dasselbe Kennzeichen generiert
*/ */
public class kennzeichenzufaelliggenerieren { public class kennzeichenzufaelliggenerieren {
private static final ArrayList<String> speichereEindutigeNummern = new ArrayList<>(); // Keine Duplikate
private static Set<String> speichereEindutigeNummern = new HashSet<>();
private static final String[] ersteZweiZeichen = { "MA", "HD", "KA", "FF", "ROK", "BW", "HH", "B", "D" }; private static final String[] ersteZweiZeichen = { "MA", "HD", "KA", "FF", "ROK", "BW", "HH", "B", "D" };
private static final String[] zweiteZweizeichen = { "ME", "SH", "DF", "KC", "FT", "GH", "OM", "KL", "CV" }; private static final String[] zweiteZweizeichen = { "ME", "SH", "DF", "KC", "FT", "GH", "OM", "KL", "CV" };
private static String eindutigeZahlen = ""; private static String eindutigeZahlen = "";
@ -22,18 +26,14 @@ public class kennzeichenzufaelliggenerieren {
zufaelligeKennzeichen = ersteZweiZeichen[random.nextInt(ersteZweiZeichen.length)]; zufaelligeKennzeichen = ersteZweiZeichen[random.nextInt(ersteZweiZeichen.length)];
zufaelligeKennzeichen += "-" + zweiteZweizeichen[random.nextInt(zweiteZweizeichen.length)] + " "; zufaelligeKennzeichen += "-" + zweiteZweizeichen[random.nextInt(zweiteZweizeichen.length)] + " ";
while (true) { do {
eindutigeZahlen = ""; eindutigeZahlen = "";
for (int i = 1; i <= 4; i++) for (int i = 1; i <= 4; i++)
eindutigeZahlen += random.nextInt(10); eindutigeZahlen += random.nextInt(10);
if (!checkEindutigeZeichen()) } while (speichereEindutigeNummern.contains(eindutigeZahlen));
continue;
speichereEindutigeNummern.add(eindutigeZahlen); speichereEindutigeNummern.add(eindutigeZahlen);
break;
}
zufaelligeKennzeichen += eindutigeZahlen; zufaelligeKennzeichen += eindutigeZahlen;
if (random.nextBoolean()) if (random.nextBoolean())
@ -43,12 +43,4 @@ public class kennzeichenzufaelliggenerieren {
} }
public static boolean checkEindutigeZeichen() {
for (String s : speichereEindutigeNummern)
if (s.equals(eindutigeZahlen))
return false;
return true;
}
} }