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