Übungen¶
Übung 1 (Codereview und static)¶
Was ist an diesem Code alles falsch?
package uebungen.uebung1;
/*
* °C = (°F - 32) * 5/9 (von Fahrenheit in Celsius)
* °F = °C * 1,8 + 32 (von Celsius nach Fahrenheit)
*/
public class Konvertierung {
private double celsius;
private double fahrenheit;
public Konvertierung(double celsius)
{
this.celsius = celsius;
this.fahrenheit = celsius * 1.8 + 32;
}
public Konvertierung(double fahrenheit)
{
this.celsius = fahrenheit - 32 * 5/9;
this.fahrenheit = fahrenheit;
}
public void print()
{
System.out.println(this.celsius + "\u00B0C = " + this.fahrenheit + "\u00B0F");
}
}
Eine mögliche Lösung für Übung 1
package uebungen.uebung1;
/*
* °C = (°F - 32) * 5/9 (von Fahrenheit in Celsius)
* °F = °C * 1,8 + 32 (von Celsius nach Fahrenheit)
*/
public class Konvertierung {
private Konvertierung() {
}
public static double celsiusToFahrenheit(double celsius) {
final double FACTOR_CELSIUS_TO_FAHRENHEIT = 1.8;
final int DIFFERENCE_CELSIUS_TO_FAHRENHEIT = 32;
double fahrenheit = celsius * FACTOR_CELSIUS_TO_FAHRENHEIT
+ DIFFERENCE_CELSIUS_TO_FAHRENHEIT;
return fahrenheit;
}
public static double fahrenheitToCelsius(double fahrenheit) {
final double FACTOR_FAHRENHEIT_TO_CELSIUS = 5.0/9.0;
final int DIFFERENCE_FAHRENHEIT_TO_CELSIUS = 32;
double celsius = (fahrenheit - DIFFERENCE_FAHRENHEIT_TO_CELSIUS) * FACTOR_FAHRENHEIT_TO_CELSIUS;
return celsius;
}
}
Übung 2 (String und algorithmisches Denken)¶
Übung 2
-
Erstellen Sie im Paket
uebungen.uebung2
eine Java-KlasseUebung2
mitmain()
-Methode. In diese Klasse implementieren wir statische Methoden. Öffnen Sie zum Lösen der Übung am besten die JavaDoc-Dokumentation der Klasse String. Überlegen Sie sich, bevor Sie jeweils anfangen zu implementieren, genau, wie Sie vorgehen möchten. -
Implementieren Sie eine Methode
static boolean isBinaryNumber(String s)
. Diese Methode überprüft, ob derString s
einer Binärzahl entspricht, d.h. ob er nur0
und1
enthält. -
Testen Sie die Methode
isBinaryNumber(String s)
z.B. mit den folgenden Aufrufen: -
Implementieren Sie eine Methode
static int binaryToDecimal(String s)
. Diese Methode wandelt denString s
in eine Dezimalzahl um, wenns
einer Binärzahl entspricht. Wenns
keiner Binärzahl entspricht, wird-1
zurückgegeben. -
Testen Sie die Methode
binaryToDecimal(String s)
z.B. mit den folgenden Aufrufen:System.out.println(binaryToDecimal("101101")); // 45 System.out.println(binaryToDecimal("0")); // 0 System.out.println(binaryToDecimal("000001")); // 1 System.out.println(binaryToDecimal("100000")); // 32 System.out.println(binaryToDecimal("101a01")); // -1 System.out.println(binaryToDecimal("101201")); // -1
-
Implementieren Sie eine Methode
static String toLowerCase(String input)
. Diese Methode wandelt alle Großbuchstaben ('A'...'Z') in Kleinbuchstaben um (und nur diese - alle anderen Zeichen bleiben erhalten). Schauen Sie sich dazu auch nochmal die ASCII-Tabelle an. -
Testen Sie die Methode
toLowerCase(String input)
z.B. mit den folgenden Aufrufen:
Zusatz:
-
Implementieren Sie eine Methode
static boolean isPalindrome(String input)
. Diese Methode prüft, ob es sich beiinput
um ein Palindrom handelt (also von vorne nach hinten genauso gelesen werden kann, wie von hinten nach vorne). Groß- und Kleinschreibung wird nicht berücksichtigt! Die Methode substring(int,int) ausString
ist dabei wahrscheinlich nützlich! -
Testen Sie die Methode
isPalindrome(String input)
z.B. mit den folgenden Aufrufen: -
Angenommen, Sie sollen für einen gegebenen
String
angeben, ob er korrekt geklammerte Ausdrücke enthält (nur die Klammern betrachten). Wie würden Sie vorgehen? Nicht implementieren, nur nachdenken. Folgende Beispiele:
Eine mögliche Lösung für Übung 2
package uebungen.uebung2.loesung;
public class Uebung2 {
public static boolean isBinaryNumber(String s)
{
for(int index=0; index < s.length(); index++)
{
char c = s.charAt(index);
if(!(c=='0' || c=='1'))
{
return false;
}
}
return true;
}
public static int binaryToDecimal(String s)
{
final int STRING_IS_NOT_A_BINARY_NUMBER = -1;
if(!isBinaryNumber(s))
{
return STRING_IS_NOT_A_BINARY_NUMBER;
}
int positionValue = 1;
int decimalNumber = 0;
int exp = 0;
for(int index = s.length()-1; index >= 0; index--)
{
char c = s.charAt(index);
int digit = c - '0';
int value = digit * positionValue;
decimalNumber += value;
positionValue *= 2;
}
return decimalNumber;
}
public static String toLowerCase(String input)
{
String output = "";
final int UPPER_TO_LOWER = 32;
for(int index=0; index < input.length(); index++)
{
char c = input.charAt(index);
if(c >= 'A' && c<= 'Z')
{
c += UPPER_TO_LOWER; // "automatic" type cast c = (char)(c + UPPER_TO_LOWER)
}
output += c;
}
return output;
}
public static boolean isPalindrome(String input)
{
String s = toLowerCase(input);
boolean palindrome = true;
while(palindrome && s.length() > 1)
{
char c1 = s.charAt(0);
char c2 = s.charAt(s.length() - 1);
if(c1 == c2)
{
s = s.substring(1,s.length() - 1);
}
else
{
palindrome = false;
}
}
return palindrome;
}
public static boolean checkBraces(String input)
{
int nrOpening = 0; // man koennte auch fuer jede oeffnende ++ und
int nrClosing = 0; // jede schliessende -- und dann nur eine Variable
// dann pruefen, ob nie negativ
boolean correct = true;
for(int index=0; correct && index < input.length(); index++)
{
char c = input.charAt(index);
if(c== '(')
{
nrOpening++;
}
else if(c== ')')
{
nrClosing++;
}
if(nrClosing > nrOpening) // dann waere hier < 0
{
correct = false;
}
}
if(nrOpening != nrClosing) // dann waere hier == 0
{
correct = false;
}
return correct;
}
public static void main(String[] args) {
System.out.println(isBinaryNumber("101101")); // true
System.out.println(isBinaryNumber("0")); // true
System.out.println(isBinaryNumber("101a01")); // false
System.out.println(isBinaryNumber("101201")); // false
System.out.println(binaryToDecimal("101101")); // 45
System.out.println(binaryToDecimal("0")); // 0
System.out.println(binaryToDecimal("000001")); // 1
System.out.println(binaryToDecimal("100000")); // 32
System.out.println(binaryToDecimal("101a01")); // -1
System.out.println(binaryToDecimal("101201")); // -1
System.out.println(toLowerCase("abcdEFG")); // abcdefg
System.out.println(toLowerCase("abcd123EFG")); // abcd123efg
System.out.println(toLowerCase("ABC XYZ !%")); // abc xyz !%
System.out.println(isPalindrome("Otto")); // true
System.out.println(isPalindrome("abc_CBA")); // true
System.out.println(isPalindrome("abc_-CBA")); // false
System.out.println(isPalindrome("-")); // true
System.out.println(isPalindrome("Dreh mal am Herd")); // false
// das letzte waere okay, wenn man bei der Pruefung
// die Leerzeichen ignorieren wuerde, waere auch moeglich
}
}
Übung 3 (enum und zweidimensionale Arrays)¶
Übung 3
-
Gegeben ist die folgende Klasse
TicTacToe
: -
Fügen Sie alle notwendigen Klammern
{ }
ein, so dass die Anweisungsblöcke korrekt geklammert sind. -
Erweitern Sie die Klasse
TicTacToe
um eineprint()
-Methode, die das Spielfeld auf die Konsole ausgibt (Setzen Sie z.B. für den PlayerRED
einx
und für den PlayerBlack
eino
und fürEMPTY
ein Leerzeichen oder ein-
). Die Ausgabe nach jeweils 2 Zügen vonRED
undBLACK
könnte dann z.B. so aussehen: -
Erweitern Sie die Klasse
TicTacToe
um einegewonnen()
-Methode (true
, wenn ein Spieler drei Felder horizontal, diagonal oder vertikal belegt hat; ansonstenfalse
). - Erweitern Sie die Klasse
TicTacToe
um eineunentschieden()
-Methode (true
, wenn alle Felder besetzt sind, aber kein Spieler gewonnen hat; ansonstenfalse
). - Erstellen Sie eine Test-Klasse mit
main()
-Methode. Erstellen sie darin ein Objekt der KlasseTicTacToe
. Führen Sie Züge aus (makeMove()
) und prüfen Sie, ob gewonnen wurde oder unentschieden ist (mit entsprechenden Ausgaben). -
Für 6. müssen Sie in der Testklasse Ihr
enum State
importieren. Warum ist das so? Was könnten Sie machen, damit das nicht notwendig ist? -
Zusatz: Sie können die Klasse
TicTacToe
beliebig erweitern, z.B.:- um Ausgaben, wenn gewonnen bzw. es unentschieden ist,
- um Fehler in den Indizes
i
undj
bei dermakeMove()
-Methode abzufangen, - eine Methode
spielen()
implementieren, die zufällig für die Spieler die Steine setzt usw.
Eine mögliche Lösung für Übung 3
package uebungen.uebung3;
import java.util.Random;
public class TicTacToe
{
//enum State {EMPTY, RED, BLACK};
State[][] field;
State player;
public TicTacToe()
{
this.field = new State[3][3];
this.player = State.RED;
for(int row=0; row<this.field.length; row++)
{
for (int col = 0; col < this.field[row].length; col++)
{
this.field[row][col] = State.EMPTY;
}
}
}
private void swapPlayer()
{
this.player = (this.player == State.BLACK) ? State.RED : State.BLACK;
}
public void makeMove(int row, int col, State player)
{
if(this.field[row][col]==State.EMPTY && player!=State.EMPTY)
{
this.field[row][col] = player;
}
}
public void print()
{
for(int row=0; row<this.field.length; row++)
{
for (int col = 0; col < this.field[row].length; col++)
{
/*
if(this.field[row][col] == State.EMPTY)
{
System.out.print("- ");
}
else if(this.field[row][col] == State.RED)
{
System.out.print("x ");
}
else if(this.field[row][col] == State.BLACK)
{
System.out.print("o ");
}
*/
/*
switch(this.field[row][col]) {
case EMPTY: System.out.print("- "); break;
case RED: System.out.print("x "); break;
case BLACK: System.out.print("o "); break;
}
*/
switch(this.field[row][col]) {
case EMPTY -> { System.out.print("- "); }
case RED -> { System.out.print("x "); }
case BLACK -> { System.out.print("o "); }
}
}
System.out.println();
}
System.out.println();
}
private boolean won(State player)
{
// drei in einer Zeile ?
for(int row=0; row<this.field.length; row++)
{
if(this.field[row][0]==player && this.field[row][1]==player && this.field[row][2]==player)
{
return true;
}
}
// drei in einer Spalte ?
for(int col=0; col<this.field.length; col++)
{
if(this.field[0][col]==player && this.field[1][col]==player && this.field[2][col]==player)
{
return true;
}
}
// Diagonale von links oben nach rechts unten
if(this.field[0][0]==player && this.field[1][1]==player && this.field[2][2]==player)
{
return true;
}
// Diagonale von links unten nach rechts oben
if(this.field[2][0]==player && this.field[1][1]==player && this.field[0][2]==player)
{
return true;
}
return false;
}
public boolean won()
{
return this.won(State.RED) ||this.won(State.BLACK);
}
private boolean full()
{
for(int row=0; row<this.field.length; row++)
{
for(int col=0; col<this.field[row].length; col++)
{
if(this.field[row][col]==State.EMPTY)
{
return false;
}
}
}
return true;
}
public boolean draw()
{
return this.full() && !this.won();
}
public void printResult()
{
if(this.won(State.RED))
{
System.out.println("Rot hat gewonnen!");
}
else if(this.won(State.BLACK))
{
System.out.println("Schwarz hat gewonnen!");
}
else if(this.draw())
{
System.out.println("Unentschieden!");
}
}
private boolean winPossible()
{
for(int row=0; row<this.field.length; row++)
{
for(int col=0; col<this.field[row].length; col++)
{
if(this.field[row][col]==State.EMPTY)
{
this.field[row][col] = this.player;
if(this.won(this.player))
{
this.field[row][col] = State.EMPTY;
return true;
}
this.field[row][col] = State.EMPTY;
}
}
}
return false;
}
public void makeRandomMove()
{
Random r = new Random();
int row = r.nextInt(this.field.length);
int col = r.nextInt(this.field[row].length);
while(this.field[row][col] != State.EMPTY)
{
row = r.nextInt(this.field.length);
col = r.nextInt(this.field[row].length);
}
this.field[row][col] = this.player;
this.swapPlayer();
}
}
package uebungen.uebung3;
public class Programmklasse
{
public static void main(String[] args)
{
TicTacToe ttt = new TicTacToe();
/*
ttt.print();
ttt.makeMove(1, 2, State.RED);
ttt.print();
ttt.makeMove(1, 1, State.BLACK);
ttt.print();
*/
while(!( ttt.won() || ttt.draw() ))
{
ttt.makeRandomMove();
ttt.print();
}
ttt.printResult();
}
}
Übung 4 (Exceptions)¶
Übung 4
-
Schreiben Sie ein Programm zur Eingabe von zwei Zahlen mithilfe der Klasse
JOptionPane
und deren Division! Fangen Sie folgende Ausnahmen ab:- Falls die Eingabe keiner Zahl entspricht.
- Falls die zweite Zahl eine 0 ist.
-
Scenario:
- Fenster zur Eingabe von Zahl 1 öffnet sich:
- falsche Eingabe - keine Zahl:
- Fenster öffnet sich erneut (andere Nachricht!):
- Fenster zur Eingabe von Zahl 2 öffnet sich:
- die Division Zahl1/Zahl2 schlägt fehl (
ArithmeticException
), deshalb (andere Nachricht!):
- Ergebnis
- Fenster zur Eingabe von Zahl 1 öffnet sich:
Zusatz
-
Lagern Sie eine solche Eingabemöglichkeit in eine wiederverwendbare Methode aus, z.B.
public int inputInt(int min, int max)
, welche die eingegebene Zahl zurückgibt, wobei die eingegebene Zahl im Bereich[min, max]
liegen muss. -
Lesen Sie eine Zahl ein und geben Sie die Zahl umgedreht (rückwärts gelesen) wieder aus (führende Nullen entfallen):
-
Lesen Sie eine Zahl ein und geben Sie die Quersumme der Zahl aus.
Viel Spaß!
Übung 5 (Listen und Mengen)¶
Übung 5
- Erstellen Sie eine Klasse
Uebung5
mitmain()
-Methode. - Definieren Sie in der
main()
-Methode eine Variablewords
vom TypString[]
und weisen Sie dieser Variablen folgende Werte zu:
A. Listen (List
)
- Erstellen Sie eine Methode
public static List<String> createArrayList(String[] words)
. In dieser Methode soll eineArrayList
erstellt werden. Alle Elemente in dieser Liste sind vom TypString
. Befüllen Sie diese Liste mit allen Wörtern aus demwords
-Array. Die Methode gibt die befüllte Liste (List
) zurück. - Erstellen Sie eine Methode
public static void printList(List<String> list)
. Diese Methode gibt alle Elemente der Listelist
auf der Konsole aus. Geben Sie auch die Anzahl der Elemente der Liste aus. - Erstellen Sie in der
main()
-Methode mithilfe der MethodecreateArrayList(words)
eine Liste und speichern Sie diese Liste in einer Variablen vom TypList<String>
. Geben Sie alle Elemente dieser Liste mithilfe der MethodeprintList()
auf der Konsole aus. -
Studieren Sie alle Methoden für
List
unter https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/List.html.-
Ermitteln Sie den Index in der Liste, in der
"Apple"
das erste Mal auftaucht. Erzeugen Sie folgende Ausgabe: -
Ermitteln Sie den Index in der Liste, in der
"Apple"
das letzte Mal auftaucht. Erzeugen Sie folgende Ausgabe: -
Geben Sie den Wert des ersten Elementes der Liste aus. Erzeugen Sie folgende Ausgabe:
-
Geben Sie den Wert des letzten Elementes der Liste aus. Erzeugen Sie folgende Ausgabe:
-
Löschen Sie die Werte
"Apple"
,"Google"
und"Facebook"
. Geben Sie die Liste erneut mithilfe derprintList(list)
-Methode aus.
-
B. Mengen (Set
)
- Erstellen Sie eine Methode
public static Set<String> createHashSet(String[] words)
. In dieser Methode soll eineHashSet
erstellt werden. Alle Elemente in dieser Liste sind vom TypString
. Befüllen Sie diese Liste mit allen Wörtern aus demwords
-Array. Die Methode gibt die befüllte Menge (Set
) zurück. - Erstellen Sie eine Methode
public static void printSet(Set<String> set)
. Diese Methode gibt alle Elemente der Mengeset
auf der Konsole aus. Geben Sie auch die Anzahl der Elemente der Menge aus. - Erstellen Sie in der
main()
-Methode mithilfe der MethodecreateHashSet(words)
eine Menge und speichern Sie diese Menge in einer Variablen vom TypSet<String>
. Geben Sie alle Elemente dieser Menge mithilfe der MethodeprintSet()
auf der Konsole aus. Was beobachten Sie in Bezug auf die Anzahl der Elemente im Vergleich zur Anzahl der Elemente in der Liste? Warum ist das so? - Erstellen Sie eine Methode
public static Set<String> createTreeSet(String[] words)
. In dieser Methode soll eineTreeSet
erstellt werden. Alle Elemente in dieser Liste sind vom TypString
. Befüllen Sie diese Menge (Set
) mit allen Wörtern aus demwords
-Array. Die Methode gibt die befüllte Menge (Set
) zurück. - Erstellen Sie in der
main()
-Methode mithilfe der MethodecreateTreeSet(words)
eine Menge und speichern Sie diese Menge in einer Variablen. Geben Sie alle Elemente dieser Menge mithilfe der MethodeprintSet()
auf der Konsole aus. Was beobachten Sie in Bezug auf die Sortierung der Elemente im Vergleich zurHashSet
?
Zusatz
- Erstellen Sie für die Liste eine Methode
public static List<String> findDoublets(List<String> list)
. Diese Methode erstellt eine Liste, in der alle Elemente enthalten sind, die inlist
doppelt vorkommen. Diese Elemente werden dann auch doppelt in die Resultat-Liste übernommen. Geben Sie diese Liste mithilfe derprintList()
-Methode in dermain()
-Methode aus.
Mögliche Ausgabe (je nach Reihenfolge des Aufrufs der Methoden)
Liste mit 16 Elementen :
--------------------------
Linux
Apple
Facebook
Amazon
IBM
Lenovo
Google
IBM
Microsoft
Apple
Google
Twitter
Skype
Chrome
Linux
Firefox
Index des ersten Auftretens von Apple : 1
Index des letzten Auftretens von Apple : 9
erstes Element in der Liste : Linux
letztes Element in der Liste : Firefox
Liste mit 13 Elementen :
--------------------------
Linux
Amazon
IBM
Lenovo
IBM
Microsoft
Apple
Google
Twitter
Skype
Chrome
Linux
Firefox
Doublets-
Liste mit 4 Elementen :
--------------------------
Linux
IBM
IBM
Linux
ohne Doublets-
Liste mit 9 Elementen :
--------------------------
Amazon
Lenovo
Microsoft
Apple
Google
Twitter
Skype
Chrome
Firefox
Menge mit 12 Elementen :
--------------------------
Lenovo
Google
Apple
Skype
Linux
IBM
Twitter
Chrome
Microsoft
Amazon
Facebook
Firefox
Menge mit 12 Elementen :
--------------------------
Amazon
Apple
Chrome
Facebook
Firefox
Google
IBM
Lenovo
Linux
Microsoft
Skype
Twitter
Übung 6 (Maps)¶
Übung 6
-
Erstellen Sie eine Klasse
Stadt
mit folgenden Objektvariablen:String name;
List<Integer> bevoelkerung;
float flaeche;
-
Erstellen Sie für die Klasse
Stadt
einen parametrisierten Konstruktorpublic Stadt(String name, List<Integer> bevoelkerung, float flaeche)
, der die Objektvariablen initialisiert. - Erstellen Sie für die Klasse
Stadt
eineprint()
-Methode, so dass eine Ausgabe auf der Konsole in folgender Form erscheint (Bsp.): - Erstellen Sie eine Klasse
StadtTest
mitmain()
-Methode. Kopieren Sie in die Klasse die Methodepublic static Stadt[] staedte()
hinein:public static Stadt[] staedte() { Stadt[] staedte = new Stadt[6]; List<Integer> berlinBevoelkerung = new ArrayList<>(); berlinBevoelkerung.add(3382169); berlinBevoelkerung.add(3460725); berlinBevoelkerung.add(3574830); staedte[0] = new Stadt("Berlin", berlinBevoelkerung, 891.68f); List<Integer> hamburgBevoelkerung = new ArrayList<>(); hamburgBevoelkerung.add(1715392); hamburgBevoelkerung.add(1786448); hamburgBevoelkerung.add(1810438); staedte[1] = new Stadt("Hamburg", hamburgBevoelkerung, 755.22f); List<Integer> muenchenBevoelkerung = new ArrayList<>(); muenchenBevoelkerung.add(1210223); muenchenBevoelkerung.add(1353186); muenchenBevoelkerung.add(1464301); staedte[2] = new Stadt("Muenchen", muenchenBevoelkerung, 310.70f); List<Integer> koelnBevoelkerung = new ArrayList<>(); koelnBevoelkerung.add(962884); koelnBevoelkerung.add(1007119); koelnBevoelkerung.add(1075935); staedte[3] = new Stadt("Koeln", koelnBevoelkerung, 405.02f); List<Integer> frankfurtBevoelkerung = new ArrayList<>(); frankfurtBevoelkerung.add(648550); frankfurtBevoelkerung.add(679664); frankfurtBevoelkerung.add(736414); staedte[4] = new Stadt("Frankfurt/Main", frankfurtBevoelkerung, 248.31f); berlinBevoelkerung = new ArrayList<>(); berlinBevoelkerung.add(3382169); berlinBevoelkerung.add(3460725); berlinBevoelkerung.add(3574830); staedte[5] = new Stadt("Berlin", berlinBevoelkerung, 891.68f); return staedte; }
Liste
- Erstellen Sie in der
main()
-Methode eineList<Stadt> staedteListe = new ArrayList<>();
. Fügen Sie derstaedteListe
alle Städte aus dem durch Aufruf derstaedte()
-Methode erzeugtem Array zu. - Geben Sie alle Informationen über alle Städte aus der Liste unter Verwendung der
print()
-Methode aus der KlasseStadt
aus.
Menge
- Erstellen Sie in der
main()
-Methode eineSet<Stadt> staedteMenge = new HashSet<>();
. Fügen Sie derstaedteMenge
alle Städte aus dem durch Aufruf derstaedte()
-Methode erzeugtem Array zu. - Geben Sie alle Informationen über alle Städte aus der Menge unter Verwendung der
print()
-Methode aus der KlasseStadt
aus. - Berlin erscheint doppelt, obwohl eine Menge keine doppelten Elemente enthalten darf. Warum?
Stadt - Teil 2
- Implementieren Sie in der Klasse
Stadt
dieequals(Object)
- und diehashCode()
-Methode. - Führen Sie danach die
StadtTest
-Klasse erneut aus. Was hat sich an der Menge geändert?
Maps
- Erstellen Sie in der
main()
-Methode eineMap<Integer, Stadt> staedteMap = new HashMap<>();
. Fügen Sie derstaedteMap
einen fortlaufenden, eindeutigenInteger
-Wert beginnend mit1
als Key sowie alle alle Städte aus dem durch Aufruf derstaedte()
-Methode erzeugtem Array als Value hinzu. - Geben Sie alle Informationen über alle Städte aus der Liste unter Verwendung der
print()
-Methode aus der KlasseStadt
aus. Beginnen Sie die Zeile jeweils mit der Ausgabe des Keys.
Ausgaben
------------ Liste --------------
Berlin 891,68 km2 3.382.169 3.460.725 3.574.830
Hamburg 755,22 km2 1.715.392 1.786.448 1.810.438
Muenchen 310,70 km2 1.210.223 1.353.186 1.464.301
Koeln 405,02 km2 962.884 1.007.119 1.075.935
Frankfurt/Main 248,31 km2 648.550 679.664 736.414
Berlin 891,68 km2 3.382.169 3.460.725 3.574.830
------------ Menge --------------
Frankfurt/Main 248,31 km2 648.550 679.664 736.414
Berlin 891,68 km2 3.382.169 3.460.725 3.574.830
Muenchen 310,70 km2 1.210.223 1.353.186 1.464.301
Koeln 405,02 km2 962.884 1.007.119 1.075.935
Hamburg 755,22 km2 1.715.392 1.786.448 1.810.438
------------ Maps --------------
1 Berlin 891,68 km2 3.382.169 3.460.725 3.574.830
2 Hamburg 755,22 km2 1.715.392 1.786.448 1.810.438
3 Muenchen 310,70 km2 1.210.223 1.353.186 1.464.301
4 Koeln 405,02 km2 962.884 1.007.119 1.075.935
5 Frankfurt/Main 248,31 km2 648.550 679.664 736.414
6 Berlin 891,68 km2 3.382.169 3.460.725 3.574.830
Übung 7 (Interfaces)¶
Übung 7
-
Wir beschäftigen uns nochmal mit der Übung 6, d.h. mit
Stadt
undStadtTest
. Dieses Mal geht es uns aber mehr um die Verwendung des InterfacesComparable
. Zunächst sind die beiden KlassenStadt
undStadtTest
wie folgt gegeben (das haben wir so in Übung 6 erarbeitet - es gibt eine Änderung inStadtTest
, dort benutzen wir jetzt ):import java.util.*; public class Stadt { String name; List<Integer> bevoelkerung; float flaeche; public Stadt(String name, List<Integer> bevoelkerung, float flaeche) { super(); this.name = name; this.bevoelkerung = bevoelkerung; this.flaeche = flaeche; } void print() { System.out.printf("%-18s %.2f km%c", this.name, this.flaeche, '\u00B2'); for(Integer anzahl : this.bevoelkerung) { System.out.printf("%,14d", anzahl); } System.out.println(); } @Override public boolean equals(Object o) { if(o==null) return false; if(o==this) return true; if(this.getClass()!=o.getClass()) return false; Stadt other = (Stadt)o; return (this.name.equals(other.name)); } @Override public int hashCode() { return this.name.hashCode(); } }
import java.util.*; public class StadtTest { public static Stadt[] staedte() { Stadt[] staedte = new Stadt[6]; List<Integer> berlinBevoelkerung = new ArrayList<>(); berlinBevoelkerung.add(3382169); berlinBevoelkerung.add(3460725); berlinBevoelkerung.add(3574830); staedte[0] = new Stadt("Berlin", berlinBevoelkerung, 891.68f); List<Integer> hamburgBevoelkerung = new ArrayList<>(); hamburgBevoelkerung.add(1715392); hamburgBevoelkerung.add(1786448); hamburgBevoelkerung.add(1810438); staedte[1] = new Stadt("Hamburg", hamburgBevoelkerung, 755.22f); List<Integer> muenchenBevoelkerung = new ArrayList<>(); muenchenBevoelkerung.add(1210223); muenchenBevoelkerung.add(1353186); muenchenBevoelkerung.add(1464301); staedte[2] = new Stadt("Muenchen", muenchenBevoelkerung, 310.70f); List<Integer> koelnBevoelkerung = new ArrayList<>(); koelnBevoelkerung.add(962884); koelnBevoelkerung.add(1007119); koelnBevoelkerung.add(1075935); staedte[3] = new Stadt("Koeln", koelnBevoelkerung, 405.02f); List<Integer> frankfurtBevoelkerung = new ArrayList<>(); frankfurtBevoelkerung.add(648550); frankfurtBevoelkerung.add(679664); frankfurtBevoelkerung.add(736414); staedte[4] = new Stadt("Frankfurt/Main", frankfurtBevoelkerung, 248.31f); berlinBevoelkerung = new ArrayList<>(); berlinBevoelkerung.add(3382169); berlinBevoelkerung.add(3460725); berlinBevoelkerung.add(3574830); staedte[5] = new Stadt("Berlin", berlinBevoelkerung, 891.68f); return staedte; } public static void main(String[] args) { System.out.printf("%n------------ Menge --------------%n"); Set<Stadt> staedteMenge = new HashSet<>(); for(Stadt s : staedte()) { staedteMenge.add(s); } for(Stadt s : staedteMenge) { s.print(); } System.out.printf("%n------------ Maps --------------%n"); Map<MyInteger, Stadt> staedteMap = new HashMap<>(); int i = 1; for(Stadt s : staedte()) { staedteMap.put(new MyInteger(i++), s); } for(Map.Entry<MyInteger, Stadt> entry : staedteMap.entrySet()) { MyInteger key = entry.getKey(); System.out.printf("%-3d",key.intValue()); entry.getValue().print(); } } }
-
Für die Schlüssel in der
Map
benutzen wir die selbstgeschriebne KlasseMyInteger
: -
Ändern Sie in der
StadtTest.java
den Konstruktoraufruf derSet
vonHashSet
nachTreeSet
und führen Sie die Klasse aus - es wird eine Exception geworfen (Stadt cannot be cast to class java.lang.Comparable
). Implementieren Sie fürStadt
das InterfaceComparable<Stadt>
so, dass nach den Namen der Städte sortiert wird. Führen Sie dann erneutStadtTest.java
aus. Es sollte folgende Ausgabe für dieSet
erzeugt werden: -
Ändern Sie
compareTo()
inStadt
so, dass die Namen der Städte absteigend sortiert werden und führen Sie dannStadtTest.java
erneut aus. Es sollte folgende Ausgabe erzeugt werden: -
Ändern Sie
compareTo()
inStadt
so, dass die Städte absteigend nach ihrer Fläche sortiert werden und führen Sie dannStadtTest.java
erneut aus. Es sollte folgende Ausgabe erzeugt werden: -
Ändern Sie in der
StadtTest.java
den Konstruktoraufruf derMap
vonHashMap
nachTreeMap
und führen Sie die Klasse aus - es wird eine Exception geworfen (MyInteger cannot be cast to class java.lang.Comparable
). Implementieren Sie fürMyInteger
das InterfaceComparable<MyInteger>
so, dass nach den Größen der Werte sortiert wird. Führen Sie dann erneutStadtTest.java
aus. Es sollte folgende Ausgabe für dieMap
erzeugt werden:------------ Maps -------------- 1 Berlin 891,68 km2 3.382.169 3.460.725 3.574.830 2 Hamburg 755,22 km2 1.715.392 1.786.448 1.810.438 3 Muenchen 310,70 km2 1.210.223 1.353.186 1.464.301 4 Koeln 405,02 km2 962.884 1.007.119 1.075.935 5 Frankfurt/Main 248,31 km2 648.550 679.664 736.414 6 Berlin 891,68 km2 3.382.169 3.460.725 3.574.830
-
Ändern Sie
compareTo()
inMyInteger
so, dass die Werte der Schlüssel absteigend sortiert werden und führen Sie dannStadtTest.java
erneut aus. Es sollte folgende Ausgabe erzeugt werden:------------ Maps -------------- 6 Berlin 891,68 km2 3.382.169 3.460.725 3.574.830 5 Frankfurt/Main 248,31 km2 648.550 679.664 736.414 4 Koeln 405,02 km2 962.884 1.007.119 1.075.935 3 Muenchen 310,70 km2 1.210.223 1.353.186 1.464.301 2 Hamburg 755,22 km2 1.715.392 1.786.448 1.810.438 1 Berlin 891,68 km2 3.382.169 3.460.725 3.574.830
-
Zusatz: Schreiben Sie in
StadtTest.java
eine Methodepublic static boolean contains(Map<MyInteger, Stadt> staedteMap, Stadt stadt)
, die eintrue
zurückgibt, wenn die Stadtstadt
bereits in derstaedteMap
als einvalue
existiert. Tipp: Die Methodeget(Object key)
ausMap
gibt den zukey
gehörigenvalue
zurück und mitkeySet()
bekommt man die Menge allerkeys
aus derMap
ermittelt. Testen Sie die Methode, indem Sie zur Menge nur dann diestadt
hinzufügen, wenn sie nicht bereits in der Menge aufgeführt ist. Sie sollten folgende Ausgabe erhalten:
Übung SWT (JUnit)¶
Übung SWT (JUnit)
- Probieren Sie sich mit
JUnit
aus! Schreiben Sie Unit-Tests für IhreMyInteger
-Klasse aus Aufgabe 2. - Testen Sie z.B. für
parseInt()
:"1234" -> 1234 "+1234" -> 1234 "01234" -> 1234 "-1234" -> -1234 "-01234" -> -1234 null -> Exception (IAE) kein String "" -> Exception (IAE) leerer String "+" -> Exception (IAE) nur '+' bzw. '-' --> keine Zahl "-" -> Exception (IAE) nur '+' bzw. '-' --> keine Zahl "-00000000" -> 0 "+00000000" -> 0 "-00000001" -> -1 "+00000001" -> 1 "123456a" -> Exception (IAE) keine Zahl! "-123456a" -> Exception (IAE) keine Zahl! "+123456a" -> Exception (IAE) keine Zahl! "2147483648" -> Exception (IAE) Zahl zu gross! "-2147483649" -> Exception (IAE) Zahl zu klein!
MyInteger.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
|