Start über Menüeintrag (oben links): Anwendung > JPP > Eclipse
Im Dialogfenstenster Workspace Launcher - Select Workspace das vorgeschlagene Workspace mit OK bestätigen.
Ausführen von JUnit-Tests im Eclipse:
Den in im jeweiligen Aufgabenabschnitt genannten JUnit-Test auswählen
Mit rechter Maustaste das Kontextmenü für diesen JUnit-Test öffnen
Test über Run As > JUnit Test ausführen.
Ergebnisse des Test werden mittels Farbcode und Fehlermeldung ausgegeben.
Java API Dokumentation:
Anzeige über Menüeintrag (oben links): Anwendung > JPP > Java API Documentation
Bearbeitungszeit: 90 Minuten
Erlaubte Hilfsmittel:
Stift
Papier
Abgabe der Lösung:
Als Abgabe zählt der am Ende der Prüfung in Ihrem Eclipse-Workspace gespeicherte Programmcode
welcher von uns für die Korrektur von der Festplatte kopiert wird.
Wichtig: Die Lösung wird nicht über PABS oder ähnliche Systeme abgegeben!
Wichtig: Nur der gespeicherte Programmcode kann korrigiert werden.
Somit regelmässig Abspeichern und auch keine Datein versehentlich löschen etc.
Aufgabe - TelecastSelector
In dieser Aufgabe wollen wir aus einer Menge von Fernsehsendungen
eine Teilmenge nicht überlappender Sendungen auswählen.
Teilaufgabe 1: Sender
Erstellen Sie im Paket jpp.tv die Enum Channel. Diese Enum
repräsentiert die uns zur Verfügung stehenden Sender:
ChannelA
ChannelB
ChannelC
ChannelD
Hinweis: Zum Testen Ihrer
Implementierung steht im Ordner tests der Schnittstellentest task1.TestChannelInterface
zur Verfügung.
Teilaufgabe 2: Fernsehsendung
Erstellen Sie im Paket jpp.tv die Klasse Telecast.
Diese Klasse repräsentiert eine einzelne Fernsehsendung. Implementieren Sie hierzu den Konstruktor
public Telecast(String name, Channel channel, Date start, Date end)
throws NullPointerException, IllegalArgumentException
Erzeugt eine neue Fernsehsendung mit den übergebenen Argumenten. Ist eines der vier
Argumente null so ist eine NullPointerException
zu werfen. Liegt der Anfangszeitpunkt start nicht vor dem Endzeitpunkt
end so ist eine IllegalArgumentException
zu werfen.
Hinweis: Bei Date handelt es sich um die
Klasse java.util.Date.
sowie folgende Methoden
public String getName()
Gibt den Namen der Fernsehsendung zurück.
public Channel getChannel()
Gibt den Sender der Fernsehsendung zurück.
public Date getStart()
Gibt den Anfangszeitpunkt der Fernsehsendung zurück.
public Date getEnd()
Gibt den Endzeitpunkt der Fernsehsendung zurück.
public String toString()
Gibt eine Stringrepräsentation der Fersehsendung im Format
"<channel> <name>: <start> - <end>"
zurück. Die beiden Datumswerte start und
end müssen jeweils im Format "dd.MM.yyyy HH:mm"
ausgegeben werden..
Hinweis: Die Klasse java.text.SimpleDateFormat
bietet Funktionen für die Datumsformatierung.
public boolean equals(Object obj)
Überlädt die in java.lang.Object definierte
equals-Methode. Diese Methode gibt genau dann den Wert
true zurück, wenn es sich bei dem übergebenen Parameter
obj ebenfalls um eine Instanz der Klasse Telecast
handelt und die vier Attribute channel, name,
start und end bezüglich ihrer
equals-Methode gleich sind.
public int hashCode()
Überlädt die in java.lang.Object definierte
hashCode-Methode.
Berechnen Sie den den Hash-Code nach folgenden (oder gleichwertigem) Verfahren:
Hinweis: Zum Testen Ihrer
Implementierung stehen im Ordner tests der Schnittstellentest task2.TestTelecastInterface
sowie der Funktionstest task2.TestTelecastRequired
zur Verfügung.
Teilaufgabe 3: Comparator
Erstellen Sie im Paket jpp.tv die Klasse TelecastComparator
welche das Interface java.util.Comparator<Telecast> implementiert. Die Methode
public int compare(Telecast o1, Telecast o2)
gibt einen negativen Wert, 0 oder einen positiven Wert zurück wenn
o1 entsprechend
kleiner, gleich oder größer als o2 ist. Hierbei werden die Attribute von o1
und o2 in der Reihenfolge end, start, name, channel
verglichen. Das erste Attributpaar für welches keine Gleichheit gilt wird dann für die Berechnung des Rückgabewertes verwendet.
Hinweis: Klassen wie String und Date sowie Enums, welche das Interface java.lang.Comparable implementieren, lassen sich sehr einfach vergleichen.
Hinweis: Zum Testen Ihrer
Implementierung stehen im Ordner tests der Schnittstellentest task3.TestTelecastComparatorInterface
sowie der Funktionstest task3.TestTelecastComparatorRequired
zur Verfügung.
Teilaufgabe 4: Programmauswahl
Erstellen Sie im Paket jpp.tv die Klasse TelecastSelector
mit folgender Methode:
public static List<Telecast> select(List<? extends Telecast> list)
Gibt eine nicht überlappende Teilmenge der mit der Liste list übergebenen Fernsehsendungen zurück.
Verwenden Sie hierzu folgenden Algorithmus:
Initialisiere eine Liste result
Sortiere die übergebenen Fernsehsendungen aufsteigend mit Hilfe der Klasse TelecastComparator
Nimm die erste Fernsehsendung t aus der sortierten Menge der übergebenen Fernsehsendungen heraus und füge sie in die Liste result ein.
Lösche alle Fernsehsendungen aus der sortierten Menge welche sich anhand des Anfangs- und Endzeitpunkt mit der Fernsehsendung t überschneiden.
Wenn die sortierte Menge noch Fernsehsendungen enthält, dann weiter bei Punkt 3.
Gib die Liste result zurück
Wichtig: Die als Parameter list übergebene Liste darf nicht verändert werden.
Wichtig: Die zurückgegebene Liste result ist Nach den Zeitpunkten aufsteigend sortiert.
Hinweis: Zum Testen Ihrer
Implementierung stehen im Ordner tests der Schnittstellentest task4.TestTelecastSelectorInterface
sowie der Funktionstest task4.TestTelecastSelectorRequired
zur Verfügung.
Teilaufgabe 5: Konsolenanwendung
Zu guter Letzt muss jetzt noch die main-Methode der Klasse TelecastSelector implementiert
werden um die Konsolenanwendung für die Programmauswahl zur realisieren. Hierzu soll es möglich sein, sich eine Grobauswahl von
Fernsehsendungen zusammenszustellen für welche man dann eine nicht überlappende Teilmenge ausgeben lässt.
Verwenden Sie zum Einlesen von Benutzereingaben
die Klasse java.util.Scanner. Wichtig ist hierbei für anschließende Tests der Abgabe nur eine Instanz
von Scanner innerhalb der main-Methode zu verwenden.
Realisieren Sie die Konsolenanwendung nach folgenden Schema:
Ausgabe der Anzahl n von Fernsehsendungen der
Grobauswahl in der Form "You have <n> telecasts in your list...".
Ausgabe von "Do you want to [a]dd another telecast, [s]how a selection of non-overlapping telecasts or [q]uit the programm?".
Einlesen der Benutzereingabe.
Wenn a, Eingabe einer neuen Fernsehsendung nach folgenden Schema:
Ausgabe "Name:"
Einlesen des Namens der Fernsehsendung. Bei einer ungültigen Eingabe:
Ausgeben von "Invalid input!" und Abbruch der Eingabe einer neuen Fernsehsendung.
Ausgabe "Channel:"
Einlesen des Senders der Fernsehsendung. Bei einer ungültigen Eingabe:
Ausgeben von "Invalid input!" und Abbruch der Eingabe einer neuen Fernsehsendung.
Ausgabe "Start:"
Einlesen des Anfangszeitpunkts der Fernsehsendung im Format "dd.MM.yyyy HH:mm". Bei einer ungültigen Eingabe:
Ausgeben von "Invalid input!" und Abbruch der Eingabe einer neuen Fernsehsendung.
Ausgabe "End:"
Einlesen des Endzeitpunkts der Fernsehsendung im Format "dd.MM.yyyy HH:mm". Bei einer ungültigen Eingabe:
Ausgeben von "Invalid input!" und Abbruch der Eingabe einer neuen Fernsehsendung.
Neue Fernsehsendung in die Grobauswahl einfügen
Wenn s, Ausgabe der Teilauswahl nach folgenden Schema:
Ausgabe ">>>"
Ausgabe der nicht überlappenden Fernsehsendungen der Grobauswahl. Verwenden Sie hierzu die Methode select aus Teilaufgabe 4.
Bei der Ausgabe steht jede Fernsehsendung in einer eigenen
Zeile.
Ausgabe ">>>"
Wenn q, Programm beenden.
Andernfalls Ausgabe von "Invalid input!".
Weiter bei Punkt 2.
Beispiel:
You have 0 telecasts in your list...
Do you want to [a]dd another telecast, [s]how a selection of non-overlapping telecasts or [q]uit the programm?
aa
Invalid input!
You have 0 telecasts in your list...
Do you want to [a]dd another telecast, [s]how a selection of non-overlapping telecasts or [q]uit the programm?
s
>>>
>>>
You have 0 telecasts in your list...
Do you want to [a]dd another telecast, [s]how a selection of non-overlapping telecasts or [q]uit the programm?
a
Name:
Nachrichten
Channel:
ChannelZ
Invalid input!
You have 0 telecasts in your list...
Do you want to [a]dd another telecast, [s]how a selection of non-overlapping telecasts or [q]uit the programm?
a
Name:
Nachrichten
Channel:
ChannelA
Start:
15.04.2010 20:00
End:
15.04.2010 20:10
You have 1 telecasts in your list...
Do you want to [a]dd another telecast, [s]how a selection of non-overlapping telecasts or [q]uit the programm?
a
Name:
FilmX
Channel:
ChannelD
Start:
15.04.2010 20:15
End:
15.04.2010 22:10
You have 2 telecasts in your list...
Do you want to [a]dd another telecast, [s]how a selection of non-overlapping telecasts or [q]uit the programm?
a
Name:
Doku
Channel:
ChannelB
Start:
15.04.2010 22:00
End:
15.04.2010 20:45
Invalid input!
You have 2 telecasts in your list...
Do you want to [a]dd another telecast, [s]how a selection of non-overlapping telecasts or [q]uit the programm?
a
Name:
Doku
Channel:
ChannelB
Start:
15.04.2010 22:00
End:
15.04.2010 22:45
You have 3 telecasts in your list...
Do you want to [a]dd another telecast, [s]how a selection of non-overlapping telecasts or [q]uit the programm?
s
>>>
ChannelA Nachrichten: 15.04.2010 20:00 - 15.04.2010 20:10
ChannelD FilmX: 15.04.2010 20:15 - 15.04.2010 22:10
>>>
You have 3 telecasts in your list...
Do you want to [a]dd another telecast, [s]how a selection of non-overlapping telecasts or [q]uit the programm?
q
Hinweis: Zum Testen Ihrer
Implementierung stehen im Ordner tests der Schnittstellentest task5.TestTelecastSelectorMainInterface
sowie der Funktionstest task5.TestTelecastSelectorMainRequired
zur Verfügung.