Modellieren eines Buchungssystems für Busfahrkarten

Diskutiere Modellieren eines Buchungssystems für Busfahrkarten im Java Basics - Anfänger-Themen Bereich.
L

lennero

Sorry fürs späte antworten, aber ich sitze erst jetzt wieder vor dem Pc. Danke erstmal für die Hilfe, aber eine Frage, hat es einen Grund wieso du ein Mal von Liste in deinem Code sprichst und dann von der ArrayList?
List ist ein Interface. ArrayList implementiert dieses Interface genauso wie LinkedList.

Du könntest später dahergehen und schreiben

Java:
List<Bus> buslist = new LinkedList<Bus>();
ohne etwas am restlichen Code zu ändern (Vorrausgesetzt du möchtest keine ArrayList spezifischen Methoden nutzen). Wenn du List nutzt wird garantiert dass du auch nur Methoden die im Interface List beschrieben werden nutzt. Und genau diese Methoden werden von ArrayList implementiert.

 
X

xImJugo

Ignoriert den Code, den ich in den Kommentar gepackt habe. Die Fehlerbehandlung mach ich erst am Ende in der main, aber ich bin jetzt an einen Punkt gekommen, wo ich mich frage, ob eine Arraylist tatsächlich das richtige ist. Die unten stehende Methode funktioniert zwar so wie sie soll, aber sie speichert ja jetzt alle erzeugten Buchungen in 3 verschiedenen Listen.

1. Frage : Später muss ich alle Buchungen in der Form wie bei add printen. Geht das trotz der vielen Listen?

2.Frage : Bei der Arraylist kann ich ja nur auf den index der Plätze der Inhalte zugreifen oder ? Weil ich brauche jetzt eine remove Methode, die einen int entgegennimmt und dann nach einem Bus mit der entsprechenden Busnummer sucht, aber meine Arraylist für die Busse kann ja nicht auf meine Bus klasse und der getBusNumber methode zugreifen. Was soll ich tun? Wäre hier eine Collection nicht doch sinnvoller?

Java:
public void add(int busnumber, String start, String goal, double price) {
        // try {
        busse.add(new Bus(busnumber));
        station.add(new Station(start, goal));
        tickets.add(new Ticket(price));
        System.out.println("OK");
        // } catch (IllegalArgumentException e) {
        // System.out.println("ERROR " + e.getMessage());
        // }
    }
 
X

xImJugo

Also die Modellierung ist relativ simple :
ich habe eine station klasse (enthält namen vom Bahnhof, zielbahnhof und zielbahnhof)
- ticket klasse (enthält nur preis)
- bus (enthält nur busnummer)
- costumer/kunde ( vorname, nachname, kundennummer)
und eben die bookingSystem klasse in der ich alle klassen + Rechungsnummer als Attribut habe
alles natürlich mit setter/getter und Konstruktoren.

Wenn nun der add Befehl zum Bsp mit (15, berlin, paris,500.50) aufgerufen wird, sollen diese Sachen entsprechend erzeugt werden, also ein Bus, der mit der Busnummer 15 gekennzeichnet ist, von Berlin nach Paris fährt, und der ganze Spaß 500.50 kostet. Soweit so gut, im Moment werden alle einzelnen Bausteine durch ihre jeweiligen Konstruktoren erzeugt und in ihrer separaten ArrayListen (wie oben gezeigt) gespeichert. Aber jetzt ergibt sich beim remove Befehl das erste Problem. Beim Methodenaufruf remove(15) soll meine buss ArrayList seine Elemente durchsuchen und schauen ob es irgendwo einen Bus mit nummer 15 gibt (die theorie zum löschen ist mir bewusst), aber ich glaube die Arrayliste kann meine beschriebene Funktionalität nicht oder ?
Irgendwer Lösungsvorschläge ? Collection? einfacher Array?

Wie gesagt dann kommt noch der 3. Befehl, der soll die Buslinien ausdrucken können. Also wenn der print Befehl aufgerufen wird, soll 15 berlin paris 500.50 ausgegeben werden (und ggnf aufsteigend nach der Busnummer sortieren ohne, dass sich die Buchung ändert)
 
mihe7

mihe7

ich habe eine station klasse (enthält namen vom Bahnhof, zielbahnhof und zielbahnhof)
- ticket klasse (enthält nur preis)
- bus (enthält nur busnummer)
- costumer/kunde ( vorname, nachname, kundennummer)
und eben die bookingSystem klasse in der ich alle klassen + Rechungsnummer als Attribut habe
alles natürlich mit setter/getter und Konstruktoren.
Man kann hier nicht sehen, was der Zweck des Ganzen ist. Wenn es nur darum geht, Tickets zu verkaufen, wofür brauchst Du dann Bus und Bahnhöfe? Da fehlt doch was...
 
MoxxiManagarm

MoxxiManagarm

Das Ticket hat keinen Preis in der Aufgabe. Wir reden bei der Aufgabe von einem Modell wie Flixbus, nicht von Stadtbus. Du hast eine Fahrt, auf der Fahrt fährt ein Bus von A nach B. Die Fahrt besitzt den Preis. Ein Ticket berechtigt einen Kunden für diese Fahrt. Der zu entrichtende Preis ist dem Kunden über diese Beziehung bekannt.
 
X

xImJugo

Hier ist nun die restliche Aufgabe. Hab sie jetzt einfach komplett eingefügt, statt mich tot zu reden xD. Es geht ja nicht nur darum Tickets zu verkaufen. Es geht um Buchungen bzw ein Buchungssystem für Reisen und die besteht aus einem Transportmittel (= Bus mit busnumber), Start und ZielBahnhof (= Buslinie), Preis/Ticket und eigentlich noch Währung . Später kommt wie unten zu sehen noch Befehle zum buchen, wo dann auch Kundennummern und Rechnungsnummern wichtig wird. Hoffentlich ist es jetzt klarer.


Aufgabe :
In dieser Aufgabe soll ein Buchungssystem für Busfahrkarten implementiert werden. Ein Omnibus,
kurz Bus, ist ein großes Verkehrsmittel, welches unter anderem auch im öffentlichen Personennahverkehr
der Beförderung zahlreicher Personen dient. Hierbei kann ein Omnibus über seine
eindeutige Busnummer identifiziert werden. Eine Fahrkarte ist ein Ausweis, der gegen Entrichtung
eines bestimmten Geldbetrages zur Benutzung eines öffentlichen Verkehrsmittels berechtigt. Ein
Busbahnhof ist eine größere Haltestellenanlage, die als Verknüpfungspunkt verschiedener Buslinien
dient. Hierbei kann jeder Busbahnhof über eine eindeutige Zeichenkette identifiziert werden. Eine
Buslinie ist die Verbindung zweier Busbahnhöfe, die regelmäßig durch Omnibusse bedient wird.
[... PlatzHalter vom Anfang..]

B.2 Befehle
Nach dem Start nimmt Ihr Programm über die Konsole mittels Terminal . readLine () Eingaben
entgegen, welche im Folgenden näher spezifiziert werden. Nach Abarbeitung einer Eingabe
wartet Ihr Programm auf weitere Eingaben, bis das Programm irgendwann durch die Eingabe der
Zeichenfolge quit beendet wird.
Achten Sie darauf, dass durch die Ausführung der folgenden Befehle die gegebene Spezifikationen
nicht verletzt werden und geben Sie in diesen Fällen immer eine aussagekräftige Fehlermeldung aus.
Wenn die Benutzereingabe nicht dem vorgegebenen Format entspricht, ist auch eine Fehlermeldung
auszugeben. Nach der Ausgabe einer Fehlermeldung soll das Programm wie erwartet fortfahren
und wieder auf die nächste Eingabe warten. Jede Fehlermeldung muss mit Error, beginnen und
darf keine Zeilenumbrüche enthalten. Den weiteren Text der Fehlermeldung dürfen Sie frei wählen,
er sollte jedoch sinnvoll sein.

B.2.1 Der add-Befehl
Dieser Befehl fügt dem Buchungssystem eine neue buchbare Buslinie hinzu.

Eingabeformat add <Busnummer >;< Start >;< Ziel >;< Preis >;<Währung >

Ausgabeformat Im Erfolgsfall wird OK ausgegeben.

B.2.2 Der remove-Befehl
Mit dem Befehl ist es möglich, Buslinien aus den Buchungssystem zu entfernen. Gestrichene
Buslinien mit einer Busnummer können jedoch zu einem späteren Zeitpunkt mittels add-Befehl
dem System wieder hinzugefügt werden.

Eingabeformat remove <Busnummer >

Ausgabeformat Im Erfolgsfall wird OK ausgegeben.

B.2.3 Der list - route-Befehl
Der parameterlose Befehl gibt die Liste aller buchbaren Buslinien auf der Konsole aus.

Eingabeformat list - route

Ausgabeformat <Busnummer >;< Start >;< Ziel >;< Preis >;<Währung >
Die buchbaren Buslinien werden zeilenweise analog des Eingabeformats des add-Befehls aufsteigend
sortiert nach der <Busnummer > ausgegeben. Groß- und Kleinschreibung des Start- und Zielbusbahnhofs
stimmen mit der zuvor mittels add-Befehl getätigten Eingabe überein. Für den Fall, dass
noch keine Buslinie hinzugefügt wurden, findet keine Ausgabe statt.

B.2.4 Der book-Befehl
Mit dem Befehl kann ein Kunde ein Busticket buchen. Jeder erfolgreichen Buchung wird eine neuen
Rechnungsnummer zugewiesen. Auch wird mit jeder erfolgreichen Buchung ein neuer Kunde mit
einer eindeutigen Kundennummer angelegt, es sei denn ein Kunde mit dem gleichen Namen hat
bereits früher eine Bestellung getätigt.
Eingabeformat book <Busnummer >;< Vorname >;< Nachname >
Ausgabeformat <Rechnungsnummer >;< Kundennummer >
Im Erfolgsfall werden die zugehörige Rechnungs- und Kundennummern angezeigt. Rechnungsnummern
für die mittels remove-Befehl gelöschten Buslinien werden nicht mit ausgegeben und auch
nicht wiederverwendet.

B.2.5 Der list-bookings-Befehl
Der parameterlose Befehl gibt eine Liste aller bisher getätigten Buchungen auf der Konsole auf. Die
mittels remove-Befehl gelöschten Buslinien werden nicht mit ausgegeben.

Eingabeformat list - bookings

Ausgabeformat <Kundennummer >,< Busnummer >,< Rechnungsnummer >
Alle Busticketbuchungen werden zeilenweise ausgegeben. Die Ausgabe erfolgt aufsteigend sortiert
nach der Kundennummer. Bei identischer Kundennummer wird absteigend nach der Rechnungsnummer
sortiert. Für den Fall, dass noch keine Buchungen vorgenommen wurden, findet keine
Ausgabe statt.

B.2.6 Der quit-Befehl
Der parameterlose Befehl ermöglicht es, das Buchungssystem vollständig zu beenden. Dabei findet
keine Konsolenausgabe statt. Beachten Sie, dass hierfür keine Methoden wie System . exit ()
oder Runtime . exit () verwendet werden dürfen.
 
MoxxiManagarm

MoxxiManagarm

Du brauchst diese 4 Entity Klassen:
Bus(Busnummer)
Verbindung(Bus, Start, Ziel, Preis, Währung) // ist 1 Fahrt
Ticket(Rechnungsnummer, Verbindung, Kunde)
Kunde(Kundennummer, Vorname, Nachname)

Dann hast du eine Managerklasse, welche die Befehle entgegen nimmt und eine Liste zu jeder dieser 4 Entity Klassen verwaltet.

EDIT: ich habe nochmal gelesen und glaube Bus als Entity und Relation zu Verbindung entfällt, stattdessen wird einfach nur die Busnummer eingetragen.
 
Zuletzt bearbeitet:
L

lennero

Wenn nun der add Befehl zum Bsp mit (15, berlin, paris,500.50) aufgerufen wird, sollen diese Sachen entsprechend erzeugt werden, also ein Bus, der mit der Busnummer 15 gekennzeichnet ist, von Berlin nach Paris fährt, und der ganze Spaß 500.50 kostet. Soweit so gut, im Moment werden alle einzelnen Bausteine durch ihre jeweiligen Konstruktoren erzeugt und in ihrer separaten ArrayListen (wie oben gezeigt) gespeichert. Aber jetzt ergibt sich beim remove Befehl das erste Problem. Beim Methodenaufruf remove(15) soll meine buss ArrayList seine Elemente durchsuchen und schauen ob es irgendwo einen Bus mit nummer 15 gibt (die theorie zum löschen ist mir bewusst), aber ich glaube die Arrayliste kann meine beschriebene Funktionalität nicht oder ?
Irgendwer Lösungsvorschläge ? Collection? einfacher Array?

Wie gesagt dann kommt noch der 3. Befehl, der soll die Buslinien ausdrucken können. Also wenn der print Befehl aufgerufen wird, soll 15 berlin paris 500.50 ausgegeben werden (und ggnf aufsteigend nach der Busnummer sortieren ohne, dass sich die Buchung ändert)
Warum nicht?
 
X

xImJugo

Du brauchst diese 4 Entity Klassen:
Bus(Busnummer)
Verbindung(Bus, Start, Ziel, Preis, Währung) // ist 1 Fahrt
Ticket(Rechnungsnummer, Verbindung, Kunde)
Kunde(Kundennummer, Vorname, Nachname)

Dann hast du eine Managerklasse, welche die Befehle entgegen nimmt und eine Liste zu jeder dieser 4 Entity Klassen verwaltet.

EDIT: ich habe nochmal gelesen und glaube Bus als Entity und Relation zu Verbindung entfällt, stattdessen wird einfach nur die Busnummer eingetragen.
Meinst du insgesamt 1 Liste für alle oder jeweils pro Klasse eine Liste zum Verwalten, wie es oben schon zu sehen ist?
 
X

xImJugo

Du brauchst diese 4 Entity Klassen:
Bus(Busnummer)
Verbindung(Bus, Start, Ziel, Preis, Währung) // ist 1 Fahrt
Ticket(Rechnungsnummer, Verbindung, Kunde)
Kunde(Kundennummer, Vorname, Nachname)

Dann hast du eine Managerklasse, welche die Befehle entgegen nimmt und eine Liste zu jeder dieser 4 Entity Klassen verwaltet.

EDIT: ich habe nochmal gelesen und glaube Bus als Entity und Relation zu Verbindung entfällt, stattdessen wird einfach nur die Busnummer eingetragen.
und wie würden die Konstruktoren jeweils für die Klassen aussehen? würde der Konstruktor von Bus leer bleiben oder soll er direkt einen int entgegen nehmen und als Busnumber initialisieren? Wenn letzteres der Fall ist, wie steck ich den Bus dann in die Verbindungsklasse ?
 
L

lennero

Weil ich nicht wüsste wie ? Die arrayListe besitzt zwar die contain methode, die guckt ob gewisse Objekte in der Liste zu finden sind, aber wenn ich versuche liste.contains(bus.getBusNumber()) aufzurufen, erkennt er mein Bus objekt nicht
BusNumber ist ein int. Contains überprüft mithilfe von object.equals ob das Element in der Liste vorhanden ist. Du prüfst also ob ein integer in einer Liste von Bussen vorhanden ist. Also gibt contains auch immer ein false zurück. Du musst der contains Methode entweder das Bus Objekt übergeben, oder du überschreibst die equals Methode in deiner Bus Klasse.
 
MoxxiManagarm

MoxxiManagarm

Ich hatte oben meinen Eintrag schon editiert und gemeint ich habe mich vermutlich vertan und du brauchst keine Extra Busklasse. Der Bus scheint lediglich durch die Nummer in der Verbindung repräsentiert zu werden. Verbleiben 3 Entity Klassen.
 
X

xImJugo

BusNumber ist ein int. Contains überprüft mithilfe von object.equals ob das Element in der Liste vorhanden ist. Du prüfst also ob ein integer in einer Liste von Bussen vorhanden ist. Also gibt contains auch immer ein false zurück. Du musst der contains Methode entweder das Bus Objekt übergeben, oder du überschreibst die equals Methode in deiner Bus Klasse.
Das ist ja eben das Problem. Wie übergebe ich denn das Bus Objekt der contains methode ? Und welche deiner beiden Optionen würdest du mir empfehlen ?
 
X

xImJugo

Du suchst ja auch nicht die Busnummer in der Liste, sondern das Element mit dieser Busnummer in der Liste.
Ist mir schon bewusst, aber meine buss Arraylist findet meine Busse nicht und dementsprechend kann ich auch nicht die getNumber methode auf mein Busobjekt anwenden. Ich verzweifle schon wieder seit stunden daran. Kann mir wer das bitte beispielhaft zeigen
 
L

lennero

Ist mir schon bewusst, aber meine buss Arraylist findet meine Busse nicht und dementsprechend kann ich auch nicht die getNumber methode auf mein Busobjekt anwenden. Ich verzweifle schon wieder seit stunden daran. Kann mir wer das bitte beispielhaft zeigen
Java:
for(int i = 0; i < busList.size(); i++)
    if(busList.get(i).getBusNumber() == 1234) //bus mit nummer 1234 gefunden
        Bus target = busList.get(i);
 
X

xImJugo

Java:
for(int i = 0; i < busList.size(); i++)
    if(busList.get(i).getBusNumber() == 1234) //bus mit nummer 1234 gefunden
        Bus target = busList.get(i);
Ach ich bin dumm. Das ist ja fast das gleiche Itterationsprinzip wie bei normalen Arrays, aber danke du rettest mir meinen Tag, wobei ich gerade merke, dass ich einen Denkfehler hatte. Ich hab jetzt eine funktionierende Methode, die zwar den richtigen Bus löscht, aber eben nicht die Busverbindung, aber das sollte ich hinbekommen. Danke euch allen für jetzt
 
J

Javinner

@xImJugo
Wie wäre es mit:
Java:
void removeVehicle(Vehicle v)
{
    if(this.vehicleList.contains(v))
    {
        this.vehicleList.remove(v);
    }
}
oder...
Java:
void removeVehicle(Vehicle v)
{
    int toRemove = this.vehicleList.indexOf(v);
    this.vehicleList.remove(this.vehicleList.getI(toRemove));
}
Dabei wird jedes Fahrzeug Anhand Hash identifiziert.
 
Thema: 

Modellieren eines Buchungssystems für Busfahrkarten

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben