Du arbeitest an einem Projekt, um ein Zugplanungssystem für ein stark befahrenes Schienennetz zu entwickeln.
Du sollst einen Prototyp für die Zugstrecken im Planungssystem entwickeln. Jede Strecke besteht aus einer Abfolge von Bahnhöfen, an denen ein bestimmter Zug hält.
Dein Team hat beschlossen, jede Zugstrecke im Fahrplan durch eine doppelt verkettete Liste darzustellen. Jeder Bahnhof entlang der Strecke des Zuges wird durch einen Knoten in der verketteten Liste dargestellt.
Du brauchst dir keine Gedanken über Ankunfts- und Abfahrtszeiten an den Bahnhöfen zu machen. Jeder Bahnhof wird einfach durch eine Zahl dargestellt.
Strecken können erweitert werden, indem du Bahnhöfe am Anfang oder Ende einer Strecke hinzufügst. Sie können auch verkürzt werden, indem du Bahnhöfe am Anfang oder Ende einer Strecke entfernst.
Manchmal wird ein Bahnhof geschlossen, und in diesem Fall muss er aus der Strecke entfernt werden, auch wenn er nicht am Anfang oder Ende der Strecke liegt.
Die Größe einer Strecke bemisst sich nicht danach, wie weit der Zug fährt, sondern danach, an wie vielen Bahnhöfen er hält.
Die verkettete Liste ist eine grundlegende Datenstruktur in der Informatik und wird oft bei der Implementierung anderer Datenstrukturen verwendet. Wie der Name schon sagt, ist sie eine Liste von Knoten, die miteinander verknüpft sind. Sie ist eine Liste von „Knoten“, wobei jeder Knoten mit seinem Nachbarn oder seinen Nachbarn verknüpft ist. In einer einfach verketteten Liste ist jeder Knoten nur mit dem Knoten verknüpft, der auf ihn folgt. In einer doppelt verketteten Liste ist jeder Knoten sowohl mit dem Knoten verknüpft, der vor ihm kommt, als auch mit dem Knoten, der nach ihm kommt.
Wenn du tiefer in verkettete Listen eintauchen möchtest, schau dir diesen Artikel an, der sie mit schönen Zeichnungen erklärt.
In dieser Übung lernst du Generics kennen.
Damit die Tests bestehen, musst du deine Klasse so aufbauen, dass sie jede Art von Eingabe akzeptiert, z. B. Integer oder String.
Generics sind nützlich, weil sie es dir ermöglichen, allgemeineren und wiederverwendbaren Code zu schreiben.
Die Java-Implementierungen von List und Map sind beide Beispiele für Klassen, die Generics verwenden.
Wenn du sie verwendest, kannst du eine List erstellen, die Integers enthält, oder eine Liste mit Strings oder jedem anderen Typ.
Es gibt ein paar Einschränkungen für die Typen, die in Generics verwendet werden.
Eine davon ist, dass du keine Strings mehr in eine List hineinlegen kannst, sobald du sie mit Integers erstellt hast.
Du musst angeben, welchen Typ du in die Klasse legen willst, wenn du sie erstellst, und diese Instanz lässt sich danach nur noch mit diesem Typ verwenden.
Zum Beispiel könntest du eine Liste mit Integers erstellen:
List<Integer> someList = new LinkedList<>();
Jetzt kann someList nur noch Integers enthalten. Du könntest auch Folgendes tun:
List<String> someOtherList = new LinkedList<>()
Jetzt kann someOtherList nur noch Strings enthalten.
Eine weitere Einschränkung ist, dass kein Typ, der mit Generics verwendet wird, ein primitiver Typ sein kann, wie etwa int oder long.
Allerdings hat jeder primitive Typ einen entsprechenden Referenztyp. Statt int kannst du also Integer verwenden und statt long Long.
Es kann helfen, dir ein Beispiel für die Verwendung von Generics anzusehen, um einen Einstieg zu finden.
Melde dich bei Exercism an, um Java mit 26 Konzepte158 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.