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(3.7); // Ausgabe: 4.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 {
private final String kennzeichen;
private final Date einfahrt;
private Date einfahrt;
private Date ausfahrt;
private boolean bezahlt;
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
public void testEinfahrenOhneEingabe() throws ParseException {
parkhaus.einfahrenextern("", "");
parkhaus.einfahren("", "");
assertEquals(179, parkhaus.getMaxPlaetze());
}
@ -23,8 +23,7 @@ class JTest_Einfahren {
public void testEinfahrenMitEingabe() throws ParseException {
String kennzeichen = "MA-SH 4077";
String einfahrtzeit = "01.10.2024, 14:30";
String test = parkhaus.einfahrenextern(kennzeichen, einfahrtzeit);
String test = parkhaus.einfahren(kennzeichen, einfahrtzeit);
assertTrue(test.contains(kennzeichen));
assertTrue(test.contains(einfahrtzeit));
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;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) throws ParseException {
new TextUI();
public static void main(String[] args) throws ParseException, AutoNichtGefundenException {
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.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
/* Parkhaus klasse
@ -23,7 +24,7 @@ public class Parkhaus {
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;
Fahrzeug fahrzeug;
if (kennzeichen.isEmpty() && einfahrtzeit.isEmpty())
@ -42,55 +43,77 @@ public class Parkhaus {
+ fahrzeug.getEinfahrtFormatted() + " im Parkhaus eingefahren.";
}
public String einfahrenextern(String kennzeichen, String einfahrtzeit) throws ParseException {
return einfahrenIntern(kennzeichen, einfahrtzeit);
}
private int berechneParkgebuehrenIntern(String kennzeichen, String ausfahrtzeit)throws AutoNichtGefundenException, ParseException {
Fahrzeug fahrzeug = findeFahrzeug(kennzeichen);
Date ausfahrt = sdf.parse(ausfahrtzeit);
Date einfahrt = fahrzeug.getEinfahrt();
long inMinuten = ((ausfahrt.getTime() - einfahrt.getTime()) / 1000 / 60);
int inStunden = (int) Math.ceil(inMinuten / 60); // Z.b = 6 Stunden
int maxNachtBetrag = 5;
int maxTagBetrag = 15;
int betrag;
if (inMinuten <= 15)
betrag = 0;
// 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);
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.");
}
else {
betrag = inStunden;
Fahrzeug fahrzeug = findeFahrzeug(kennzeichen);
Date einfahrt = fahrzeug.getEinfahrt();
Date ausfahrt;
if (betrag > maxTagBetrag)
betrag = maxTagBetrag;
}
if (ausfahrtzeit.isEmpty()) {
String aktuelleZeitString = sdf.format(new Date());
ausfahrt = sdf.parse(aktuelleZeitString);
} else {
ausfahrt = sdf.parse(ausfahrtzeit);
}
fahrzeug.setBetrag(betrag);
return fahrzeug.getBetrag();
double inMinuten = (ausfahrt.getTime() - einfahrt.getTime()) / 1000.0 / 60.0;
int inStunden = (int) Math.ceil(inMinuten / 60.0);
int maxNachtBetrag = 5;
int maxTagBetrag = 15;
int betrag = 0;
}
// Erstellung von Calendar-Objekten für Einfahrt und Ausfahrt
Calendar calEinfahrt = Calendar.getInstance();
calEinfahrt.setTime(einfahrt);
public int berechneParkgebuehrenExtern(String kennzeichen, String ausfahrtzeit) throws AutoNichtGefundenException, ParseException {
int betrag = berechneParkgebuehrenIntern(kennzeichen, ausfahrtzeit);
return betrag;
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)
betrag = 0;
else if ((einfahrtStunde < 6 || einfahrtStunde >= 20) || (ausfahrtStunde < 6 || ausfahrtStunde >= 20)) {
betrag = (inStunden <= maxNachtBetrag) ? inStunden : maxNachtBetrag;
System.out.println(betrag);
}
else {
betrag = inStunden;
if (betrag > maxTagBetrag) {
betrag = maxTagBetrag;
}
}
fahrzeug.setBetrag(betrag);
return fahrzeug.getBetrag();
}
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() {
return maxPlaetze > 0;
}
private boolean checkSchulden(String kennzeichen) {
public boolean checkSchulden(String kennzeichen) {
for (Fahrzeug sc : fahrzeugeMitSchulden)
if (sc.getKennzeichen().equals(kennzeichen))
return true;
@ -98,20 +121,6 @@ public class Parkhaus {
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:
public ArrayList<Fahrzeug> getFahrzeuge() {
return fahrzeuge;

View File

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

View File

@ -1,16 +1,20 @@
package Parkhaus;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
/*kennzeichenzufaelliggenerieren:
*
* - Diese Klasse hat nur die Aufgabe, zufällige Kennzeichen zu generieren
* - 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 {
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[] zweiteZweizeichen = { "ME", "SH", "DF", "KC", "FT", "GH", "OM", "KL", "CV" };
private static String eindutigeZahlen = "";
@ -22,18 +26,14 @@ public class kennzeichenzufaelliggenerieren {
zufaelligeKennzeichen = ersteZweiZeichen[random.nextInt(ersteZweiZeichen.length)];
zufaelligeKennzeichen += "-" + zweiteZweizeichen[random.nextInt(zweiteZweizeichen.length)] + " ";
while (true) {
do {
eindutigeZahlen = "";
for (int i = 1; i <= 4; i++)
eindutigeZahlen += random.nextInt(10);
if (!checkEindutigeZeichen())
continue;
speichereEindutigeNummern.add(eindutigeZahlen);
break;
}
} while (speichereEindutigeNummern.contains(eindutigeZahlen));
speichereEindutigeNummern.add(eindutigeZahlen);
zufaelligeKennzeichen += eindutigeZahlen;
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;
}
}