Generische Klassen - Universität Paderborn

Werbung
Orga
Universität Paderborn
Prof. Dr. Heike Wehrheim
Keine Vorlesung am 23.12. (und auch nicht
am 24.12.)
Stattdessen Selbststudium des Themas
„Generische Klassen“ (Aufgabenstellung
wird auf Webseite gestellt)
GP1, WS 08/09
450
Universität Paderborn
Prof. Dr. Heike Wehrheim
Kapitel 2:
Grundlagen der
Objektorientierung
2.2 Strings, Wrapper classes,
Hashmaps
GP1, WS 08/09
451
Strings
Universität Paderborn
Prof. Dr. Heike Wehrheim
ƒ Klasse String bereits implizit benutzt
Literale z.B. "Welcome to Java"
"Good bye"
ƒ jetzt:
ƒ Deklarationen von String-Variablen und
ƒ Zuweisungen
String hello = "Welcome to Java";
String ist der Typ für Zeichenketten
GP1, WS 08/09
452
Universität Paderborn
Prof. Dr. Heike Wehrheim
Strings
Strings sind nicht primitive Typen, sondern
Referenztypen.
Eine Zeichenkette ist also ein Objekt der Klasse
String.
Anschaulich:
eine Zeichenkette besteht aus einer Folge von
einzelnen Zeichen
String s = “Hallo“;
‘H‘ ‘a‘ ‘l‘
GP1, WS 08/09
‘l‘
‘o‘
453
Sonderfall String
Universität Paderborn
Prof. Dr. Heike Wehrheim
Die Klasse String ist ein Sonderfall in Java:
ist Referenztyp, aber Objekterzeugung funktioniert
ohne new
String s = “ Ein Text“;
erzeugt ein neues String-Objekt
GP1, WS 08/09
454
Klasse String
Universität Paderborn
Prof. Dr. Heike Wehrheim
Die Klasse String stellt eine Reihe von Operationen
auf Zeichenketten zur Verfügung.
Eine kennen wir schon:
ƒ + - Konkatenation auf Strings
“Hello “ + “World“ = “Hello World“
GP1, WS 08/09
455
Länge und Elementzugriff
Universität Paderborn
Prof. Dr. Heike Wehrheim
ƒ int length ()
Länge des Strings (Anzahl Zeichen)
ƒ char charAt (int index)
das Zeichen an Position index
(Anfang: Position 0)
String s = “Java“
char c;
c = s.charAt(1);
c = s.charAt(-1);
c = s.charAt(4);
int len = s.length();
GP1, WS 08/09
//
//
//
//
c = ‘a‘
Fehler
Fehler
len = 4
456
Vergleich von Strings
Universität Paderborn
Prof. Dr. Heike Wehrheim
ƒ int compareTo (String s)
Lexikographischer Vergleich mit einem
anderen String,
Resultat: negativ wenn s größer, 0 wenn s gleich, positiv,
wenn s kleiner (als das Objekt selber)
ƒ boolean equals (String s)
Vergleich der Inhalte, wenn gleich, dann
true, sonst false
“hello“ == new String(“hello“)
“hello“.equals(“hello“)
“hello“.compareTo(“hello“)
“hello“.compareTo(“java“)
GP1, WS 08/09
//
//
//
//
false
true
0
-2
457
Teile in Strings
Universität Paderborn
Prof. Dr. Heike Wehrheim
ƒ int indexOf (String s)
Suchen des (ersten) Teilstrings s und
Rückgabe der Position
(1. Zeichen 0; nicht gefunden= -1 )
ƒ String substring (int begin, int end)
Extraktion eines Teilstrings aus einem
String, von Position “begin” bis vor
“end”
“Java“.indexOf(“a“)
// 1
“Hello World“.substring(4,8)
// “o Wo“
GP1, WS 08/09
458
Konversion in Strings
Universität Paderborn
Prof. Dr. Heike Wehrheim
ƒ Zu den Grundtypen gibt es eine implizite Konversion in ein
String -Objekt,
z. B.
"The total of the " + count + " numbers is "
+ sum
ƒ Das gilt auch für alle Klassen, die eine Methode toString
definieren,
z. B. könnte man für Circle definieren
public String toString () {
return “a Circle at “ + x + “, “ + y +
“ with radius “ + radius;
}
Und dann für Circle c:
System.out.println(“Ein Kreis:“ + c);
GP1, WS 08/09
459
Wo findet man das alles?
Universität Paderborn
Prof. Dr. Heike Wehrheim
In der Java API (= application programming
interface):
http://java.sun.com/j2se/1.5.0/docs/api/
GP1, WS 08/09
460
Ein größeres Beispiel
Universität Paderborn
Prof. Dr. Heike Wehrheim
Parametrisierter Liedtext:
3 bottles of whiskey on the wall,
3 bottles of whiskey!
You take one down and pass it around:
2 bottles of whiskey on the wall. 2 bottles of whiskey on the
wall, 2 bottles of whiskey!
You take one down and pass it around:
1 bottle of whiskey on the wall. 1 bottle of whiskey on the
wall,1 bottle of whiskey!
You take one down and pass it around:
No bottles of whiskey on the wall.
Parameter:
Startwert n = 3
„Stuff“ (Sache, Kram, Ding) = „whiskey“
Was ändert sich? (kursiv)
GP1, WS 08/09
461
In Java
static String sing (String stuff, int n) {
Universität Paderborn
Prof. Dr. Heike Wehrheim
Sauflied.java
String plural, text = ""; // in text wird Lied aufgebaut
if (n < 1) return "";
if (n == 1) plural = ""; else plural = "s";
do {
// Den n-ten Vers anhängen:
text = text + n+" bottle"+plural+" of "+stuff+" on the wall,\n";
text = text + n+" bottle"+plural+" of "+stuff+"!\n";
text = text + "You take one down and pass it around:\n";
n = n - 1;
if (n == 1) plural = "";
// the last bottle
if (n == 0)
text = text + "No bottles of "+stuff+" on the wall!\n";
else text = text + n+" bottle"+plural+" of "+stuff+" on the
wall.\n\n";
} while (n > 0);
return text;
}
GP1, WS 08/09
462
Weiteres Beispiel
Universität Paderborn
Prof. Dr. Heike Wehrheim
Rekursive Methode zum Wortumdrehen
(Algorithmus bereits bei Rekursion besprochen)
Aufgabe: Wort umdrehen, z.B. gras -> sarg
Algorithmus:
WORT FKT dreheWortUm (WORT wort)
WENN wort == „“
DANN RETURN wort
SONST RETURN
hängeAn (dreheWortUm(wort ohne ersten
Buchstaben),
erster Buchstabe)
GP1, WS 08/09
463
In Java
Universität Paderborn
Prof. Dr. Heike Wehrheim
static String wortUmdrehen (String
wort) {
if (wort.equals("")) {
return wort;
Wort ohne ersten
}
Buchstaben
else {
return wortUmdrehen
Hänge
(wort.substring(1,wort.length()))
an
+ wort.substring(0,1);
}
Erster Buchstabe (als String)
}
Welche Aufrufe von wortUmdrehen zieht der Aufruf
wortUmdrehen(„blub“) nach sich?
GP1, WS 08/09
464
Fragen
1.
Universität Paderborn
Prof. Dr. Heike Wehrheim
Gegeben: String s = „Universitaet“;
Was ist das Ergebnis von s.substring(4,7) ?
(a) „ver“ (b) „ive“ (c) „ers“ (d) „versita“
2. Welche Ergebnisse sind negativ?
(a) „Anton“.compareTo(„Auto“)
(b) „Anton“.compareTo(„Antonia“)
(c) „Anton“.compareTo(„Anton“)
3. Was wird gedruckt?
(a) int i=3; System.out.print(„Anton ist „ + i + 1);
(b) int i=3; System.out.print(„Anton ist „ + (i + 1));
(c) int i=3; System.out.print(i + 1);
(d) int i=3; System.out.print(i + 1 + „ ist Anton“);
GP1, WS 08/09
465
Wrapper
Universität Paderborn
Prof. Dr. Heike Wehrheim
Haben nun 2 verschiedene Arten von Typen:
ƒ Primitive Typen: boolean, char, int, …
ƒ Referenztypen
Manche Datenstrukturen erwarten immer Objekte,
Elemente der primitiven Typen sind aber keine
Objekte
-> zu jedem primitiven Typ gibt es auch eine
entsprechende Klasse
Wrapper classes (ein Wert eines primitiven Typs
wird „eingepackt“)
GP1, WS 08/09
466
Wrapper
Universität Paderborn
Prof. Dr. Heike Wehrheim
Zu den Grundtypen
byte, short, int, long, float, double,
boolean, char
jeweils Klassen, die Werte in Objekten kapseln und
Methoden dafür definieren:
Byte, Short, Integer, Long, Float,
Double, Boolean, Character
(2. Grund für Wrapper:
alle zu den Grundtypen gehörenden Methoden und
Konstanten in einer Klasse kapseln)
GP1, WS 08/09
467
Beispiel: Integer
Universität Paderborn
Prof. Dr. Heike Wehrheim
Klasse Integer
ƒ definiert Konstanten MAX_VALUE, MIN_VALUE
(und andere)
ƒ zwei Konstruktoren:
Integer (int value)
erzeugt Integer-Objekt aus int-Wert
Integer (String s)
erzeugt Integer-Objekt aus Zeichenkette
mit int-Wert
Integer integer = new Integer(23);
GP1, WS 08/09
468
Weiterhin
Universität Paderborn
Prof. Dr. Heike Wehrheim
ƒ Viele Objektmethoden, unter anderem:
String toString ()
Zeichenkette aus Integer-Objekt
int intValue()
der int Wert
boolean equals (Object obj)
vergleicht mit anderem Objekt
Integer integer = new Integer(42);
int i = integer.intValue(); // i=42
GP1, WS 08/09
469
Weiterhin: parseInt
Universität Paderborn
Prof. Dr. Heike Wehrheim
Methode parseInt kennen wir schon
In API nochmal nachschauen:
http://java.sun.com/j2se/1.5.0/docs/api/
parseInt ist eine Klassenmethode von Integer,
deshalb Aufruf mit
Integer.parseInt(…)
GP1, WS 08/09
470
Beispiele
Universität Paderborn
Prof. Dr. Heike Wehrheim
Integer zahl1 = new Integer(4);
Integer zahl2 = new Integer(“4“);
zahl1.equals(zahl2)
// liefert was?
zahl1 == zahl2
// liefert was?
System.out.println(zahl1);
// benutzt toString
GP1, WS 08/09
471
Andere Wrapper Klassen
Universität Paderborn
Prof. Dr. Heike Wehrheim
Ähnliche Konstruktoren/Methoden
z.B. Boolean
ƒ definiert Konstanten FALSE, TRUE (Objekte(!)
vom Typ Boolean)
ƒ Konstruktoren
Boolean(boolean value)
Boolean(String s)
ƒ Methoden toString, equals,
booleanValue, …
(in der API angucken!)
GP1, WS 08/09
472
Autoboxing
Universität Paderborn
Prof. Dr. Heike Wehrheim
Relativ umständlich, nun immer int in Integer und
umgekehrt umzuwandeln
ƒ
ƒ
new Integer(42) …
Integer.intValue() …
Deshalb: der Compiler fügt automatisch solche
Methodenaufrufe ein (Autoboxing):
ƒ Wird ein Objekt gebraucht, aber es steht nur ein
primitiver Wert zur Verfügung, wird der primitive
Wert in Wrapperobjekt verpackt
ƒ Wird ein primitiver Wert gebraucht, aber es steht
nur ein Wrapperobjekt zur Verfügung, dann wird
ein „Getter“-Aufruf eingefügt
GP1, WS 08/09
473
Universität Paderborn
Prof. Dr. Heike Wehrheim
Beispiel
Erlaubt ist
Integer integer = 42;
Und dann auch
int i = integer;
Autoboxing macht aber keine implizite Typkonversion
Double d = 4;
GP1, WS 08/09
// geht nicht!!
474
Universität Paderborn
Prof. Dr. Heike Wehrheim
Fragen
1. Erlaubt oder nicht? Sei Integer i = new
Integer(7); vorgegeben
(a) if (i == 7) …
(b) if (i == new Integer(7)) …
(c) if (i.intValue() == 7) …
Wobei wird der Inhalt von i auf Gleichheit mit 7
geprüft?
IntegerTest.java
GP1, WS 08/09
475
Wörterbücher
Universität Paderborn
Prof. Dr. Heike Wehrheim
Wörterbuch:
ƒ Datenstruktur zur Speicherung von Paaren
(Schlüssel, Wert)
ƒ Operationen:
ƒ ein Paar zufügen;
ƒ den Wert zu einem Schlüssel liefern
ƒ Beispiele für solche Mengen von Paaren:
(Name, Studierendendaten) in der Studierendenverwaltung
(deutsche Vokabel, englische Vokabel) Wörterbuch im
engen Sinne
(Koordinate, geografisches Objekt) Sammlung
geografischer Informationen
GP1, WS 08/09
476
Dafür Arrays?
Universität Paderborn
Prof. Dr. Heike Wehrheim
Arrays bieten direkten Zugriff auf Elemente
Aber: feste Größe
Index nur ganze Zahl, beginnend bei 0
Benötigt:
ƒ variable Größe
ƒ Zugriff mit beliebigem Schlüssel
ƒ wichtig: schneller Zugriff!
deshalb Benutzung von sogenannten Hashtabellen
(s. VL Datenstrukturen und Algorithmen)
GP1, WS 08/09
477
Hashtabellen
Universität Paderborn
Prof. Dr. Heike Wehrheim
Grundlegende Idee:
aus dem Schlüssel eines Paares wird ein Index
berechnet
das Paar wird an oder nach diesem Index in einer
(linear geordneten) Datenstruktur gespeichert
beim Zugriff wird entsprechend von dem Index an
gesucht, der zum Schlüssel gehört
GP1, WS 08/09
478
In Java
Universität Paderborn
Prof. Dr. Heike Wehrheim
Implementiert durch die Klasse HashMap
(muss importiert werden: import java.util.*; )
Die Klasse HashMap benutzt 2 Typen
ƒ Typ des Schlüssels
ƒ Typ des Wertes
Wenn ein HashMap-Objekt erzeugt wird, müssen diese
Typen angegeben werden
Beispiel: Telefonbuch
(Schlüssel, Wert): (Name, Telefonnummer)
HashMap<String, Integer> tele =
new HashMap<String, Integer>();
(HashMap ist eine sogenannte generische Klasse)
GP1, WS 08/09
Hier wird
Referenztyp
479
erwartet
Größe
Universität Paderborn
Prof. Dr. Heike Wehrheim
Objekte der Klasse HashMap können im Gegensatz
zu Arrays beliebig wachsen (keine feste Länge)
Bei Objekterzeugung kann man aber eine
Anfangskapazität angeben:
…=new HashMap<String,
Integer>(100);
GP1, WS 08/09
480
Operationen
Universität Paderborn
Prof. Dr. Heike Wehrheim
Typvariablen
HashMap<K, V>
ƒ V put (K key, V value);
// Paar zufügen
ƒ V get (Object key);
// Wert zum Schlüssel liefern
ƒ boolean containsKey (Object key);
// Gibt es ein Paar mit dem Schlüssel?
Object: beliebige Objekte
GP1, WS 08/09
481
Weitere Operationen
Universität Paderborn
Prof. Dr. Heike Wehrheim
ƒ boolean containsValue (Object value);
// Gibt es ein Paar mit dem Wert?
ƒ V remove (Object key);
// Paar mit dem Schlüssel entfernen
GP1, WS 08/09
482
Beispiel
Universität Paderborn
Prof. Dr. Heike Wehrheim
import java.util.*;
HashMap<String, String> englischDeutsch =
new HashMap<String, String>(100);
// Wörterbuch füllen
englischDeutsch.put ("dog", "Hund");
englischDeutsch.put ("cat", "Katze");
// ein Zugriff auf das Wörterbuch:
System.out.println(englischDeutsch.get("dog"))
;
// gibt es eine Übersetzung für “cow”?
if (englischDeutsch.containsKey(“cow”)) ...
// gibt es ein Paar, dessen Wert “Kuh” ist?
if (englischDeutsch.containsValue(“Kuh”)) ...
// Löschen des Paares mit dem Schlüssel “dog”
englischDeutsch.remove(“dog”);
GP1, WS 08/09
483
Herunterladen