Heute • Nachbetrachtung Wissensüberprüfung • • • • • • Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() Iterator Interface Map 2.12.2014 IT I - VO 9 1 Organisatorisches • Nächste Woche entfällt die Vorlesung. • In der Übung wird mich Martin Antenreiter vertreten. • Wissensüberprüfung findet normal statt. • Heute zwei ÜBlätter, eines bis nächste Woche, eines bis nach Weihnachten. 2.12.2014 IT I - VO 9 2 Organisatorisches • Am 17. Dezember findet ab 15 Uhr der Zwischentest statt. • Ort: voraussichtlich RaiffeisenHörsaal (E-Mail folgt). • Am 16. Dezember Fragestunde in der VO. • Übung am 18. Dezember? 2.12.2014 IT I - VO 9 3 Wissensüberprüfung • Wie geht man mit List um? - List ist ein Interface. - Es gibt keinen Konstruktor! • Wie funktioniert Min/Max-Suche? - Ein Durchlauf aller Elemente genügt! - paarweiser Vergleich aller Elemente bringt wenig 2.12.2014 IT I - VO 9 4 List • Rückgabewert List<Anlage>: muss Objekt einer Klasse zurückgeben, das List implementiert, z.B. ArrayList • List<Anlage> = new ArrayList<Anlage>(); oder • ArrayList<Anlage> = new ArrayList<Anlage>(); 2.12.2014 IT I - VO 9 5 Sortieralgorithmen • Einfache Sortieralgorithmen: - Selectionsort: Für j=1,...,#Elemente-1: Suche das j-größte Element und vertausche es mit Element j. - Bubblesort: Vertausche solange benachbarte Elemente in falscher Reihenfolge, bis sortiert. 2.12.2014 IT I - VO 9 6 Selectionsort double[] a; // zu sortierendes Array for(int i=0; i<a.length-1; i++) { // suche kleinstes Element von a[i] bis a[a.length-1] int min = i; for(int j=i+1; j<a.length; j++) { if( a[j] < a[min]) min = j; } // vertausche kleinstes Element a[min] mit a[i] double hilf = a[min]; a[min] = a[i]; a[i] = hilf; } 2.12.2014 IT I - VO 9 7 Bubblesort double[] a; // zu sortierendes Array do{ boolean veraendert = false; for (i=0; i<a.length-2; i++){ if (a[i] > a[i+1]){ // vertausche a[i] mit a[i+1] double hilf = a[i]; a[i] = a[i+1]; a[i+1] = hilf; veraendert = true; } } }while(veraendert) 2.12.2014 IT I - VO 9 8 Klasse Arrays (in java.util) Stellt zahlreiche Methoden für Arrays zur Verfügung: – static void sort(Object[] a) – static String toString(Object[] a) – static boolean equals(Object[] a1, Object[] a2) – static int hashCode(Object[] a) 2.12.2014 IT I - VO 9 9 Java interfaces • Interfaces sind eine besondere Form von abstrakten Klassen: – Alle Methoden sind public und abstract. – Es gibt keine Konstruktoren. – Es gibt keine Attribute außer Konstantendefinitionen, die public, static und final sind. • D.h., dass eine nicht-abstrakte Unterklasse eines Interfaces alle Methoden des Interfaces implementieren muss. • Insofern ist ein Interface eine Spezifikation, die angibt, über welche Methoden eine Objekt dieses Typs verfügt. 2.12.2014 IT I - VO 9 10 Interface Comparable (in java.lang) class T implements Comparable<T> legt fest, dass Objekte der Klasse T mit anderen Objekten der Klasse T vergleichbar sind. Dazu muss die Methode public int compareTo(T obj) überschrieben werden. 2.12.2014 IT I - VO 9 11 Interface Comparable (in java.lang) • Die Methode public int compareTo(T obj) muss so implementiert werden, dass sie – eine negative Zahl zurückgibt, wenn this kleiner als obj ist, – eine positive Zahl zurückgibt, wenn this größer als obj ist, – 0 zurückgibt, wenn this gleich obj ist. • Wenn x.compareTo(y)==0, dann sollte auch x.equals(y)==true. 2.12.2014 IT I - VO 9 12 Klasse TreeSet (in java.util) • Implementierung des Interfaces Set, das die Vergleichbarkeit der Elemente mittels compareTo() ausnutzt. – Die Elemente können in der durch compareTo() definierten Reihenfolge zugegriffen werden. 2.12.2014 IT I - VO 9 13 Interface Map (in java.util) • Maps speichern Schlüssel-Wert (keyvalue) Paare. – – – – Map<K,V> aMap = new HashMap<K,V>(); aMap.put(key,value); V value = aMap.get(key); aMap.remove(key); • Implementierte Klassen: – HashMap • verwendet hashCode() der Keys zum Abspeichern und Suchen, – TreeMap • Verwendet Comparable, um nach Key zu sortieren 2.12.2014 IT I - VO 9 14 Beispiel HashMap <String, String> phoneBook = new HashMap<String, String>(); phoneBook.put("Charles Nguyen", "(531) 9392 4587"); String phoneNumber = phoneBook.get("Lisa Jones"); :HashMap 2.12.2014 "Charles Nguyen" "(531) 9392 4587" "Lisa Jones" "(402) 4536 4674" "William H. Smith" "(998) 5488 0123" IT I - VO 9 15 Schleifen und ArrayLists • Objekte in ArrayList können innerhalb eines Schleifendurchlaufs geändert werden. • Problemlos: aktuelle Elemente ändern oder ersetzen • Problematisch: aktuelle Elemente löschen oder Elemente hinzufügen 2.12.2014 IT I - VO 9 16 Schleifen und Collections Löschen/Hinzufügen von Elementen während Durchlaufs einer Collection: • for-each: geht nicht (Exception!) • for-Schleife: geht, aber muss Indizes entsprechend ändern 2.12.2014 IT I - VO 9 17 Interface Iterator (in java.util) • Implementierung von Iterator liefert Alternative zu for-each-Schleife. • Iterator bietet folgende Methoden: hasNext(): gibt's noch ein Element? next(): gib nächstes Element zurück • Auslesen aus Iterator mittels whileSchleife 2.12.2014 IT I - VO 9 18 Interface Iterator • Beispiel: Auslesen aus Iterator it: while(it.hasNext()) { System.out.print(it.next()); } 2.12.2014 IT I - VO 9 19 Interfaces Iterator und Iterable • Iterator<E> ist generische Klasse. • Collection<E> implementiert Interface Iterable<E>. • Das Interface Iterable<E> enthält Methode Iterator<E> iterator(), die die Elemente der Collection an einen Iterator übergibt. 2.12.2014 IT I - VO 9 20 Vorteil Iterator • Interface Iterator<E> verfügt auch über Methode remove(), die in der zugrundeliegenden Collection das aktuelle Element entfernt. • Das ermöglicht das Löschen während des Auslesens. 2.12.2014 IT I - VO 9 21