Kapitel 16

Werbung
Schein-/Bachelorklausur Teil 2 am 13.02.2007
Zulassung: Mindestens 14 Punkte in Teilklausur 1 und
50% der Übungspunkte aus dem 2. Übungsblock.
Alle Studiengänge außer Bachelor
melden sich über die Lehrstuhlwebseite an.
Anmeldebeginn: Mo. 29.01.2007
Anmeldeschluß: Fr. 02.02.2007 um 17:00 Uhr.
http://media.informatik.rwth-aachen.de/
programmierung_ws0607.html
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
1
Schein-/Bachelorklausur Teil 2 am 13.02.2007
Zulassung: Mindestens 14 Punkte in Teilklausur 1 und
50% der Übungspunkte aus dem 2. Übungsblock.
Die Anmeldung für die Bachelorstudenten
fand im Dezember 2006 statt.
Die Anmeldung für die
Schein-/Bachelor-Nachschreibeklausur
am 27.03.2007
erfolgt über die Lehrstuhlseite nach Bekanntgabe
der Ergebnisse der Teilklausur 2 (Ende Februar).
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
2
Sie müssen beide Schein-/Bachelor Teilklausuren bestehen.
In jeder Teilklausur müssen Sie mindestens
25% der Punkte erreichen.
In beiden Teilklausuren zusammen müssen Sie mindestens
50% der Gesamtpunkte aus beiden Klausuren
erreichen.
25% in jeder Teilklausur
!=
50% in beiden Teilklausuren
Borchers: Programmierung für Alle (Java), WS 06/07
!
Kapitel 16
3
Collections
Generics
Dynamische Datenstrukturen
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
4
Baum
Graph
Liste
Stapel
Warteschlange
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
5
Stapel / Stack
V
V
pop
push
a
m
LIFO-Prinzip: Last In, First Out
z
x
push(v) speichert oben ein neues Element
v = pop() entfernt das oberste Element
dritter ()
p
zweiter () n
e
erster ()
z
Stack-Speicher
(siehe 07-Kap9.pdf, Folie 15)
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
6
Warteschlange
put
get
v a m z x
FIFO-Prinzip: First In, First Out
put(v) fügt ein Element am Ende der Schlange ein
x = get() entfernt das vorderste Element
Alternative: Warteschlange als Ringpuffer — Feste
Größe, wobei die ältesten Elemente überschrieben
werden können.
tail
Borchers: Programmierung für Alle (Java), WS 06/07
v a
x
z
m
head
Kapitel 16
7
Bäume und Graphen
z.B. binärer Suchbaum
2
1
4
5
3
Jeder Knoten hat max. 2 Nachfolger: Der linke Unterbaum
enthält nur Elemente, deren Werte kleiner als der Wert des Knotens
sind. Der rechte Unterbaum enthält nur Elemente, deren Werte größer
oder gleich dem Wert des Knotens sind.
Graphen
X
A
Verbindung zwischen Punkten (Straßen, Eisenbahn),
Bestimmung von Routen und Entfernungen,
Telefonnetz...
Borchers: Programmierung für Alle (Java), WS 06/07
Z
V
W
Kapitel 16
8
Collections in Java: Beispiele
List: Indexposition bekannt,
speichert doppelte Elemente
0
1
2
3
Set: Speichert keine doppelten Elemente
(Menge)
Map: Elemente sind Name/Wert-Paare,
keine doppelten Schlüssel
“Löwe” “Cubbi”
Borchers: Programmierung für Alle (Java), WS 06/07
“Bär” “Flugzeug”
Kapitel 16
9
Collections in Java: Beispiele
// Array als Liste (dynamisch)
ArrayList
// schnelles Einfügen/Löschen von Elementen in der Mitte der Liste
LinkedList
// Elemente in sortierter Reihenfolge ohne doppelte Einträge speichern
TreeSet
// keine doppelten Elemente, schnelles Auffinden von Elementen
HashSet
// Elemente als Name/Wert-Paare speichern
HashMap
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
10
ArrayList
0
1
2
3
String[] namen = new String[100]; // Array hat unveränderbare Länge,
namen[0] = “Hans”;
// zum Suchen eines Wertes muß
...
// das gesamte Array durchlaufen werden
namen[99] = “Werner”;
// ArrayList hat dynamisch Länge
ArrayList<String> namenAL = new ArrayList<String>();
namenAL.add(“Hans”);
namenAL.add(“Werner”);
...
namenAL.add(10, “Stefan”);
namenAL.remove(“Stefan”);
namenAL.remove(2);
// an Position 10 einfügen, Rest verschieben
// Stefan entfernen
// Element an Position 2 entfernen
// suchen & entfernen über Indexposition
namenAL.remove(namenAL.contains(“Hans”));
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
11
ArrayList sortieren
String[] namen = new String[100]; // unveränderbare Länge
namen[0] = “Hans”;
...
namen[99] = “Werner”;
// Die Klasse Arrays sortiert Arrays mit primitiven Elementen / Strings
Arrays.sort(namen);
ArrayList<String> namenAL = new ArrayList<String>(); // dynamisch Länge
namenAL.add(“Stefan”);
namenAL.add(“Werner”);
namenAL.add(“Hans”);
// Die Klasse Collections sortiert Listen mit primitiven Elementen / Strings
Collections.sort(namenAL);
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
12
Geht das?
public class Buch {
String titel, autor; int jahr;
}
public Buch (String t, String a, int j) {
titel = t; autor = a; jahr = j;
}
// Konstruktor
public String getTitel() { return titel; }
public String getAutor() { return autor; }
// Getter & Setter
// irgendwo im Programm
ArrayList<Buch> bücherListe = new ArrayList<Buch>();
bücherListe.add(new Buch(“Java von Kopf bis Fuß”, “Sierra/Bates”, 2006));
bücherListe.add(new Buch(“Java for Dummies”, “Burd”, 2006));
// Nein! Wie werden Objekte der Klasse Buch sortiert?
Collections.sort(bücherListe);
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
13
Typsicherheit durch Generics
mit Java 5.0
vor Java 5.0
ArrayList<Löwe>
ArrayList
(ArrayList<Object> in Java 5.0)
Löwe
Löwe
Object
nimmt nur Löwe-Objekte auf
(oder Unterklassenobjekte
von Löwe)
Object
Object
nimmt beliebige Objekte auf
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
14
Generics mit Java 5.0
// Definition der Klasse ArrayList
public class ArrayList<E> extends AbstractList<E> implements List<E> ... {
public boolean add(E o) {
// E ist Platzhalter für den Elementtyp, den die ArrayList enthalten kann
}
...
}
ArrayList<String> namenListe = new ArrayList<String>(); // E durch String bzw.
ArrayList<Buch> bücherListe = new ArrayList<Buch>(); // durch Buch ersetzen
// Definition der sort-Methode in der Klasse Collections
public static <T extends Comparable<? super T>> void sort (List<T> list) {
// T muß vom Typ Comparable sein
// “T extends” bedeutet bei Generics entweder “T extends” oder “T implements”
// <? super T> bedeutet:T oder Supertyp von T
// Der Typ der Liste (list) muß also Comparable erweitern bzw. implementieren.
}
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
15
ArrayList<Flugzeug> flugzeuge = new ArrayList<Flugzeug>();
ArrayList<A380> vieleA380 = new ArrayList<A380>();
// Geht das?
befüllen(flugzeuge);
befüllen(vieleA380);
// ok
// geht nicht!
tanken(flugzeuge);
tanken(vieleA380);
// ok
// A380 extends Flugzeug
class Flugzeug { ... }
class A380 extends Flugzeug {...}
// nur eine ArrayList<Flugzeug> kann übergeben werden
public void befüllen(ArrayList<Flugzeug> liste) { ... }
// ArrayList<Flugzeug> oder ein Untertyp von Flugzeug kann übergeben werden
public <T extends Flugzeug> void tanken(ArrayList<T> liste) { ... }
public void tanken(ArrayList<? extends Flugzeug> liste) { ... } // alternative Schreibweise
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
16
java.lang.Comparable
public interface Comparable<T> {
// liefert -1, 0 oder 1 zurück, je nachdem ob das Objekt “this” kleiner, gleich
// oder größer als das übergebene Objekt “o” ist.
int compareTo (T o);
}
// um Buch-Objekte zu sortieren, muß Buch “Comparable<Buch>” implementieren
public class Buch implements Comparable<Buch> {
String titel, autor;
int jahr;
...
public int compareTo (Buch b) {
// Bücher nach Titel sortieren über
return titel.compareTo(b.getTitel()); // compareTo() der Klasse String
}
}
ArrayList<Buch> bücherListe = new ArrayList<Buch>(); // Bücher hinzufügen...
Collections.sort(bücherListe);
// ArrayList<Buch> sortieren
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
17
Wie lautet die Return-Anweisung, um
Bücher nach Autor zu sortieren?
public class Buch implements Comparable<Buch> {
String titel, autor;
int jahr;
SMS mit Ergebnis an:
...
// Bücher nach Autor sortieren lassen
01577 - 287 21 96
public int compareTo (Buch b) {
return ???
}
}
ArrayList<Buch> bücherListe = new ArrayList<Buch>();
...
Collections.sort(bücherListe);
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
18
Wie lautet die Return-Anweisung, um
Bücher nach Autor zu sortieren?
public class Buch implements Comparable<Buch> {
String titel, autor;
int jahr;
...
// Bücher nach Autor sortieren lassen
public int compareTo (Buch b) {
return autor.compareTo(b.getAutor());
}
}
ArrayList<Buch> bücherListe = new ArrayList<Buch>();
...
Collections.sort(bücherListe);
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
19
java.util.Comparator
public interface Comparator<T> {
// liefert -1, 0 oder 1 zurück, je nachdem ob das Objekt “o1” kleiner, gleich
// oder größer als das Objekt “o2” ist.
int compare (T o1, T o2);
}
// Generics in der überladenen sort-Methode der Klasse Collections
public static <T> void sort (List<T> list, Comparator<? super T> c) {
// Wir übergeben ein Comparator-Objekt, das die Sortierung der Elemente
// in der Liste übernimmt. Für jede gewünschte Sortierreihenfolge schreiben wir
// eine eigene Klasse, die Comparator implementiert.
}
Eigene Comparator-Klassen erlauben, mehr als eine
Sortierreihenfolge zu definieren.
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
20
public class Buch implements Comparable<Buch> {
String titel, autor;
int jahr;
...
public int compareTo (Buch b) {
// Bücher nach Titel sortieren
return titel.compareTo(b.getTitel());
}
}
public class SortTest {
ArrayList<Buch> bücherListe = new ArrayList<Buch>();
// eine innere Comparator-Klasse, die Bücher nach Autor sortiert
class AutorenVergleich implements Comparator<Buch> {
int compare (Buch b1, Buch b2) {
return b1.getAutor().compareTo(b2.getAutor()); // String-Vergleich
}
} // evtl. weitere Comparator-Klassen, die Bücher nach Jahr, ISBN, etc. sortieren
}
Collections.sort(bücherListe);
// nach Titel sortieren
Collections.sort(bücherListe, new AutorenVergleich()); // nach Autor sortieren
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
21
HashSet: doppelte Elemente entfernen
public class Buch implements Comparable<Buch> {
String titel, autor;
int jahr;
...
}
ArrayList<Buch> bücherListe = new ArrayList<Buch>();
bücherListe.add(new Buch(“Java von Kopf bis Fuß”, “Sierra, Bates”, 2006));
bücherListe.add(new Buch(“Java von Kopf bis Fuß”, “Sierra, Bates”, 2006));
bücherListe.add(new Buch(“Java for Dummies”, “Burd”, 2006));
...
// alle Bücher in ein HashSet hinzufügen, damit Duplikate entfernt werden
HashSet<Buch> bücherSet = new HashSet<Buch>();
bücherSet.addAll(bücherListe); // alle Elemente auf einmal hinzufügen
// Hmm... “Java von Kopf bis Fuß” gibt es immer noch doppelt?
System.out.println(bücherSet);
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
22
Gleichheit von Objekten
// Wann sind zwei Bücher für ein HashSet gleich?
Buch b1 = new Buch(new Buch(“Java von Kopf bis Fuß”, “Sierra, Bates”, 2006)
Buch b2 = new Buch(new Buch(“Java von Kopf bis Fuß”, “Sierra, Bates”, 2006)
Buch b3 = b1;
Titel:
Java...
HashCode:
512
Referenzgleichheit (identische Bits, ==)
if (b1 == b3) {
// beide Referenzen verweisen auf dasselbe Objekt auf dem Heap
// b1. hashCode() == b3.hashCode()
}
b1
Objektgleichheit
if (b1.equals(b2) && b1.hashCode() == b2.hashCode()) {
// beide Referenzen beziehen sich entweder auf ein und dasselbe Objekt
// oder auf zwei als gleich geltende Objekte
}
b3
Titel:
Java...
HashCode:
512
b2
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
23
Gleichheit von Objekten
Die Methoden der ultimativen Superklasse Object:
public boolean equals(Object obj) {
// Standardverhalten: liefert true, wenn this == obj
}
public int hashCode() {
// Standardverhalten: das Objekt erhält eine unverwechselbare Nummer
// auf Basis der Speicheradresse, die für jedes Objekt eindeutig ist.
}
Für Objektgleichheit müssen wir equals() und hashCode()
überschreiben, damit ein Set zwei unterschiedliche Objekte,
die inhaltlich gleich sind, als “gleich” behandelt.
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
24
HashSet: doppelte Elemente entfernen
public class Buch implements Comparable<Buch> {
String titel, autor;
int jahr;
...
// wir definieren “gleiche Bücher” als “gleiche Titel”
public boolean equals (Object obj) {
// Strings haben eine überschriebene
Buch buch = (Buch) obj;
// equals() und hashCode() Methode
return getTitel().equals(buch.getTitel()); // “this” mit “o” vergleichen
}
public int hashCode () { return titel.hashCode(); }
}
ArrayList<Buch> bücherListe = new ArrayList<Buch>();
HashSet<Buch> bücherSet = new HashSet<Buch>();
// alle Bücher hinzufügen, Duplikate werden jetzt wirklich entfernt :-)
bücherSet.addAll (bücherListe);
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
25
TreeSet: Elemente sortieren
// Buch muß “Comparable” implementieren
public class Buch implements Comparable<Buch> {
String titel, autor;
int jahr;
...
public int compareTo (Buch b) {
// Bücher nach Titel sortieren
return titel.compareTo(b.getTitel());
}
}
ArrayList<Buch> bücherListe = new ArrayList<Buch>();
TreeSet<Buch> bücherTreeSet = new TreeSet<Buch>(); // nach Titel
// alternativ über Comparator-Objekt nach Autor sortieren (siehe Folie 11)
// TreeSet<Buch> bücherTreeSet = new TreeSet<Buch>(new AutorenVergleich());
// alle Bücher hinzufügen, sortieren und Duplikate entfernen
bücherTreeSet.addAll (bücherListe);
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
26
HashMap:
Schlüssel/Wert-Paare
“Löwe” “Cubbi”
“Bär” “Flugzeug”
import java.util.*;
class MapTest {
public static void main(String[] args) {
// zwei Typparameter: <Schlüsseltyp,Werttyp>
HashMap<String, Integer> buecherMap = new HashMap<String, Integer>();
buecherMap.put(“Java von Kopf bis Fuß”, 2006);
buecherMap.put(“Java for Dummies”, 2006);
// gleicher Wert ist ok
buecherMap.put(“Java for Dummies”, 2004);
// gleicher Schlüssel geht nicht!
Integer wert = buecherMap.get(“Java for Dummies”); // 2006
System.out.println(buecherMap);
}
}
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
27
Jetzt sind Sie
wieder an der
Reihe!
Lesen Sie zu Collections und Generics
Kapitel 16 (Seiten 529-567).
Borchers: Programmierung für Alle (Java), WS 06/07
Kapitel 16
28
Herunterladen