Gestern Universität Paderborn Prof. Dr. Heike Wehrheim Klasse HashQueue<E> (implementiert Interface Queue<E>) Klasse LinList<E> Beide erweitert um eine Methode Iterator<E> iterator() (durch Schreiben einer inneren, Iterator implementierenden Klasse) Zwei Methoden finde, die für a) eine HashQueue unter Benutzung ihres Iterators ein Element sucht b) für eine LinList unter Benutzung ihres Iterators ein Element sucht GPI, WS 07/08 899 Universität Paderborn Prof. Dr. Heike Wehrheim finde für LinList public static boolean finde (LinList<Integer> l, int x) { Iterator<Integer> e = l.iterator(); boolean xGefunden = false; while (!xGefunden && e.hasNext()) { xGefunden = (x==((Integer)e.next()).intValue()); } return xGefunden; } GPI, WS 07/08 900 Ziel Universität Paderborn Prof. Dr. Heike Wehrheim Wiederverwendung der Methode finde: einmal schreiben, für HashQueues und LinLists verwenden Wie könnte das gehen? 1. Erweitern Interface Queue um Methode iterator() 2. Lassen LinList ebenfalls Queue implementieren 3. Nehmen dann Queue als Typ des Parameters für finde Nicht schön! GPI, WS 07/08 901 Schöne Lösung Universität Paderborn Prof. Dr. Heike Wehrheim Weitere Schnittstelle aus java.lang benutzen LinEnumIterable.java interface Iterable<T> { Iterator<T> iterator(); // generiert Iterator-Objekt } Eine implementierende Klasse (hat bereits die geforderte Methode!) class LinList<E> implements Iterable<E> { public Iterator<E> iterator() { return new ListEnum(); } ... } andere implementierende Klasse könnte HashQueue sein HashQueue würde dann Queue und Iterable implementieren (ArrayList implementiert Iterable ebenfalls!) GPI, WS 07/08 902 Dann … Universität Paderborn Prof. Dr. Heike Wehrheim finde-Methode unabhängig von konkreter Datenstruktur definierbar benutzt nur Schnittstelle Iterable public static boolean finde (Iterable<Integer> l, int x){ Iterator<Integer> e = l.iterator(); ... } GPI, WS 07/08 903 3. Beispiel - Interfaces Universität Paderborn Prof. Dr. Heike Wehrheim Wollen ein generisches Paar (= Klasse mit 2 Elementen) haben, das einen Vergleich erlaubt, wie geht das? Problem: Wie machen wir den Vergleich, wenn wir noch nicht wissen, was die Elemente sind und wie man sie vergleicht? Lösung: Interface Comparable benutzen Die generische Typvariable genauer spezifizieren: Einschränkungen für das Typargument vorgeben GPI, WS 07/08 904 Interface Comparable Universität Paderborn Prof. Dr. Heike Wehrheim Comparable<T> besitzt genau eine Methode int compareTo(T o) Aus API: „Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.“ GPI, WS 07/08 905 Paare mit Vergleich Universität Paderborn Prof. Dr. Heike Wehrheim class ComparablePair<T extends Comparable<T>> { private T first; private T second; ComparablePair(T f, T s) { first = f; second = s; } public T getFirst() { return first; }… Schränkt die Typargumente auf Klassen ein, die Comparable implementieren public boolean lessThan (ComparablePair<T> cp) { return (this.first.compareTo(cp.getFirst()) < 0) || ((this.first.compareTo(cp.getFirst()) == 0) && (this.second.compareTo(cp.getSecond()) < 0)); } } GPI, WS 07/08 ComparablePairTest.java 906 Erweitertes For Universität Paderborn Prof. Dr. Heike Wehrheim Zur Iteration über Arrays und Collections Oft Programmsegmente der Form: arr: irgendein Array for (int i = 0; i < arr.length; i++) { // arr[i] } Häufiges Problem: Variable i wird falsch gesetzt (z.B. Anfangswert 1, laufen bis arr.length) Abkürzung für solche Iterationen: for (Typ var : arrayname) { // var } GPI, WS 07/08 907 Beispiel Universität Paderborn Prof. Dr. Heike Wehrheim Ausgeben aller Argumente, die wir main in der Kommandozeile übergeben public static void main (String [] args) { for (String arg : args) { System.out.println(arg); } } Das erweiterte for kann auch geschachtelt werden int [] [] matrix = new int[3][4]; for (int [] zeile : matrix) { for (int elem : zeile) { System.out.print(elem + " "); } System.out.println(); } GPI, WS 07/08 908 Erweitertes For II Universität Paderborn Prof. Dr. Heike Wehrheim Vor-/Nachteile Vorteile: lesbarer, weniger fehleranfällig Erweitertes For nutzbar für alle Klassen, die Iterable implementieren Nachteil: Durchlauf genau festgelegt, von vorne nach hinten, jedes Element einmal GPI, WS 07/08 909 Collections Framework Universität Paderborn Prof. Dr. Heike Wehrheim Collection/Container: Klassen und Interfaces (in java.util) zur Speicherung von Objekten Entwurfskonzept: Basisgerüst für Container Einige implementierende Klassen, die oft benötigte Funktionalität zur Verfügung stellen Eigene Implementierungen der Interfaces / Erweiterungen der Klassen möglich GPI, WS 07/08 910 Übersicht: Interfaces Universität Paderborn Prof. Dr. Heike Wehrheim Collection (Sammlung von Elementen) -> List (Collection mit einer Ordnung) -> Set (Collection, in der Elemente nie doppelt vorkommen) -> SortedSet (sortierte Menge) Map (Abbildung Schlüssel auf Wert) -> SortedMap (sortierte Schlüssel) Iterator (Iteration durch Collections) (+ weitere) Spezialisierungsrelationen zwischen den Interfaces: List extends Collection, SortedSet extends Set, etc. alle Interfaces generisch im Typ der gespeicherten Elemente GPI, WS 07/08 911 Universität Paderborn Prof. Dr. Heike Wehrheim Einige implementierende Klassen Für … List ArrayList (Implementierung auf Basis von „wachsenden“ Arrays) LinkedList (Implementierung durch doppelt verkettete Liste) Set HashSet (Implementierung durch Hashverfahren) TreeSet (Implementierung durch einen balancierten binären Baum) Map HashMap (Implementierung durch eine Hashtabelle) GPI, WS 07/08 912 Einige Exceptions Universität Paderborn Prof. Dr. Heike Wehrheim UnsupportedOperationException manche Operationen der Schnittstellen sind optional; sind sie nicht implementiert, wird diese Exception bei Aufruf geworfen ClassCastException Elemente, die Methoden übergeben werden, passen nicht zum Typ der Collection NoSuchElementException Methode, die Elemente einer Collection liefern soll, findet kein Element mehr GPI, WS 07/08 913 Iterator<E> Universität Paderborn Prof. Dr. Heike Wehrheim Methoden: public boolean hasNext() weiteres Element? public E next() nächstes Element; wirft NoSuchElementException, wenn kein nächstes Element public void remove() löscht das letzte von next gelieferte Element jede Collection hat eine Methode iterator(), die ein IteratorObjekt zurückliefert (bzw. ein Objekt einer Iterator implementierenden Klasse) Collection erweitert Interface Iterable GPI, WS 07/08 914 Beispiel Universität Paderborn Prof. Dr. Heike Wehrheim Entfernen aller „langen“ Zeichenketten aus einer Collection public void entferneLangeStrings (Collection coll, int maxLaenge) { Iterator it= coll.iterator(); while (it.hasNext()) { String str = (String) it.next(); if (str.length() > maxLaenge) it.remove(); } } GPI, WS 07/08 915 Erweitertes For Universität Paderborn Prof. Dr. Heike Wehrheim Das erweiterte For kann für jede Collection benutzt werden Beispiel: Collection<Integer> coll = new TreeSet<Integer>(); coll.add(new Integer(3)); coll.add(new Integer(4)); coll.add(new Integer(5)); coll.add(new Integer(3)); // schon drin, // wird nicht nochmal // eingefügt for (Integer i : coll) { System.out.println(i); } GPI, WS 07/08 CollIt.java 916 Collection<E> Universität Paderborn Prof. Dr. Heike Wehrheim Methoden: (was kann man alles machen mit Sammlungen von Elementen) public int size () public boolean isEmpty() public boolean contains(Object o) public Iterator<E> iterator() public Object[] toArray() public boolean add(E o) public boolean remove(Object elem) GPI, WS 07/08 917 Klasse Collections (!s) Universität Paderborn Prof. Dr. Heike Wehrheim Collections ist eine Klasse, die für Collections nützliche Methoden zur Verfügung stellt Die Methoden sind alle statisch, z.B. public static void min(Collection coll) minimales Element public static void max(Collection coll) maximales Element viele Methoden für List-Objekte public static void reverse(List list) Reihenfolge umdrehen public static void sort(List list) Elemente sortieren GPI, WS 07/08 918 Beispiel: Liste umdrehen Universität Paderborn Prof. Dr. Heike Wehrheim import java.util.*; public class CollStat { public static void main (String [] args) { List<Integer> ll = new LinkedList<Integer>(); ll.add(new Integer(1)); ll.add(new Integer(2)); ll.add(new Integer(3)); … for(Integer elem : ll) System.out.print(elem + " "); System.out.println(); Collections.reverse(ll); for(Integer elem : ll) System.out.print(elem + " "); System.out.println(); } } CollStat.java GPI, WS 07/08 919 GP2 (Böttcher) Universität Paderborn Prof. Dr. Heike Wehrheim Graphische Benutzeroberflächen Applets Parallele Prozesse GPS – Grundlagen Programmiersprachen (Kastens) Grundlegende Konzepte von Programmiersprachen Logische, funktionale Sprachen Ziel: Befähigung zum schnellen, eigenen Lernen von anderen Programmiersprachen GPI, WS 07/08 920 Klausur Universität Paderborn Prof. Dr. Heike Wehrheim 3 Stunden, 9 Aufgaben 6 Programmieraufgaben 2 Aufgaben zu objekt-orientierten Konzepten allgemein, dynamische Methodenbindung und Polymorphie 1 Aufgabe zu Programmverstehen Keine Hilfsmittel zugelassen (nur Wörterbuch) Java API muss nicht auswendig gelernt werden; wenn nötig, wird ein Auszug aus API mitgeliefert GPI, WS 07/08 921 Universität Paderborn Prof. Dr. Heike Wehrheim Klausur II Datum: 17.2.09 (bzw. 31.3.09) Beginn: 12.00 (spätestens 11.45 da sein, um Platz zu suchen) Raum: Sporthalle Im Raum hängt ein Sitzplan Personalausweis, Studentenausweis mitbringen Taschen an Rand, Handys aus Ergebnisse frühestens nach 3 Wochen Die Ergebnisse von Zwischenklausur und Hauptklausur werden zusammengerechnet: insgesamt 30 Punkte ZK, 70 Punkte HK; Bonuspunkte kommen zur Endnote dazu, wenn Klausur bestanden Viel Erfolg! GPI, WS 07/08 922 Schlusswort Universität Paderborn Prof. Dr. Heike Wehrheim Sir Charles Anthony Richard Hoare (Turing Preisträger 1980): „I conclude that there are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.” Schönheit, Einfachheit, Eleganz GPI, WS 07/08 923 The End GPI, WS 07/08 Universität Paderborn Prof. Dr. Heike Wehrheim 924