Abschnitt 17: Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T>

Ähnliche Dokumente
Abschnitt 11: Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T>

Tagesprogramm

Objektorientierung III

Abschnitt 11: Beispiel: Die Klasse String (Teil 1)

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

Zusatzmaterial DIE KLASSE OBJECT. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

4. Vererbung Die Klasse Object. Die Klasse Object

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Vorkurs Informatik WiSe 15/16

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

12 Abstrakte Klassen, finale Klassen und Interfaces

Tutorium 2. Strings. Skript zur Vorlesung Einführung in die Programmierung

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Kapitel 0: Grundbegriffe Gliederung

Algorithmen und Datenstrukturen

Zeichenketten. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java. 16.

Objektorientierte Programmierung. Kapitel 18: Strings

Objektorientierte Programmierung. Kapitel 10: Strings

Autor: Alexander Brant

Überblick. Peer Kröger (LMU München) Einführung in die Programmierung WS 14/ / 595

Softwaretechnik WS 16/17. Übungsblatt 01

Strings in Java. Die String Klasse und Methoden. A. Müller

Kopieren und Vergleichen

Objektorientierte Programmierung. Kapitel 17: Strings

Erste Java-Programme (Java Wiederholung & Vererbung)

Abschnitt 7: Beispiel: Die Klasse String (Teil 1)

Kopieren und Vergleichen

Objektorientierte Programmierung. Kapitel 18: Strings

Die abstrakte Klasse Expression:

Einstieg in die Informatik mit Java

Abschnitt 3: Mathematische Grundlagen

Die Klasse java.lang.object. Thorsten Treffer

Praktische Informatik I

Einführung in die Programmierung

1 Hashing und die Klasse String

Interfaces und Vererbung

Java Idioms. Basic und Advanced Java Coding Style. Prof. Dr. Nikolaus Wulff

Informatik II. Woche 10, Giuseppe Accaputo

Einstieg in die Informatik mit Java

Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter

Software Entwicklung 1

Institut für Programmierung und Reaktive Systeme 24. April Programmieren II. 10. Übungsblatt

Abschnitt 3: Mathematische Grundlagen

String s1, s2; Eine Zuweisung geschieht am einfachsten direkt durch Angabe des Strings eingeschlossen in doppelte Hochkommata:

Übung Praktische Informatik I

Methoden und Wrapperklassen

Der Datentyp String. Stringvariable und -vergleiche

Grundlagen der theoretischen Informatik

Verarbeitung von Zeichenketten

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Programmierkurs Java

Grundelemente objektorientierter Sprachen (1)

PROCESSING EINE ZUSAMMENFASSUNG. Created by Michael Kirsch & Beat Rossmy

Organisatorisches. Folien (u.a.) auf der Lva-Homepage Skriptum über MU Online

Programmieren in Java -Eingangstest-

Mathematik für Informatiker I Mitschrift zur Vorlesung vom

Grundelemente objektorientierter Sprachen (1)

Tag 8 Repetitorium Informatik (Java)

Tag 2 Repetitorium Informatik (Java)

Listing 1: Cowboy. Listing 2: Woody

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Algorithmen und Datenstrukturen. Übersicht. Interfaces und Generics. InsertionSort für Punkte. InsertionSort für Punkte

2 Mengen, Abbildungen und Relationen

Idee: 14.2 Generische Klassen

Selbststudium OOP6 & ALG Programmieren 1 - H1103 Felix Rohrer

Waitomo. Compilerbaupraktikum Wintersemester 2006/2007. Stefan Wehr. 24. Oktober 2006

Informatik II Musterlösung

Abschnitt 11: Korrektheit von imperativen Programmen

Programmierpraktikum

Grundelemente objektorientierter Sprachen (1)

Vererbung. Martin Wirsing. Ziele. Vererbung

Einführung in die Programmierung 1

Das Interface-Konzept am Beispiel der Sprache Java

Tafelübung 07 Algorithmen und Datenstrukturen

Informatik II. Woche 15, Giuseppe Accaputo

Vererbung. Oberklassen und Unterklassen

Algorithmen zur exakten Suche in Texten. Algorithmen und Datenstrukturen II 1

Programmieren 2 Java Überblick

Organisatorisches. Folien (u.a.) gibt's auf der Lva-Homepage zum Download

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Theoretische Grundlagen des Software Engineering

Programmieren in Java

Objektorientierung II & die Java Klassenbibliothek. Kristian Bergmann und Arthur Lochstampfer

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

1 Einleitung Generizität Syntax... 2

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Programmieren in Java

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

Javakurs für Anfänger

Javakurs für Anfänger

Selbststudium OOP6 & ALG1 Auftrag

Objektorientierte Programmierung. Kapitel 19: Wrapper-Klassen

Computeranwendung und Programmierung (CuP)

1 Klassen und Objekte

Reguläre Sprachen und endliche Automaten

Kapitel 10. Programmierkurs. Grundlagen von Exceptions Behandlung von Exceptions

Transkript:

Abschnitt 17: Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 17. Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 17.1 Vergleich von Zeichenketten 17.2 Das Interface Comparable<T> 17.3 Natürliche Ordnung von Zeichenketten 17.4 Pattern Matching 17.5 String-Darstellung von Objekten 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> Einf. Progr. (WS 08/09) 698 Überblick 17. Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 17.1 Vergleich von Zeichenketten 17.2 Das Interface Comparable<T> 17.3 Natürliche Ordnung von Zeichenketten 17.4 Pattern Matching 17.5 String-Darstellung von Objekten 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 1 Vergleich von Zeichenketten Einf. Progr. (WS 08/09) 699

Zur Erinnerung: Eigenschaften von Relationen Eine Relation R A A ist reflexiv, wenn für alle a A gilt: R(a, a) symmetrisch, wenn für alle a, b A gilt: R(a, b) R(b, a) transitiv, wenn für alle a, b, c A gilt: R(a, b) R(b, c) R(a, c). antisymmetrisch, wenn für alle a, b A gilt: R(a, b) R(b, a) a = b. total, wenn für alle a, b A gilt: R(a, b) R(b, a). 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 1 Vergleich von Zeichenketten Einf. Progr. (WS 08/09) 700 Exakter Vergleich von Objekten Wie wir gesehen haben, ist in Java die Gleichheit (==) von Objekten als Überprüfung der Identität der Speicheradressen definiert. Die Klasse Object definiert aber auch eine Methode public boolean equals(object obj). Für Objekte vom Typ Object gibt x.equals(y) den gleichen Wert zurück wie der Vergleich x==y. Da jede Klasse eine Unterklasse von Object ist, verfügt auch jedes Objekt in Java über die equals-methode. Oft wird diese Methode überschrieben, um eine allgemeinere Gleichheit zu testen. Wie bereits diskutiert, unterscheidet man zwischen == und equals auch als Identität vs. Gleichheit von Objekten. 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 1 Vergleich von Zeichenketten Einf. Progr. (WS 08/09) 701

Gleichheit von Objekten Die Methode equals ist in der Klasse Object wie folgt spezifiziert: Die equals-methode implementiert eine Äquivalenz-Relation auf nicht-null Objektreferenzen mit folgenden Eigenschaften: Reflexivität: Für jede nicht-null Referenz x gilt: x.equals(x). Symmetrie: Für nicht-null Referenzen x und y ist x.equals(y) true g.d.w. y.equals(x) true ist. Transitivität: Für nicht-null Referenzen x, y und z gilt: wenn x.equals(y) und y.equals(z) true sind, dann ist auch x.equals(z) true. Konsistenz: Für nicht-null Referenzen x und y sind mehrfache Aufrufe von x.equals(y) entweder immer true oder immer false, solange keine Information in den Objekten x oder y verändertwurde, die von der Methode equals überprüft wird. Außerdem gilt für eine nicht-null Referenz x: x.equals(null) ergibt false. 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 1 Vergleich von Zeichenketten Einf. Progr. (WS 08/09) 702 Gleichheit von Objekten Diese Vorschrift soll eingehalten werden, wenn man in einer Klasse die Methode equals überschreibt. Das ist aber eine semantische Vorschrift, die nicht vom Compiler überprüft, sondern nur vom Programmierer bewiesen werden kann. Die Implementierung der Methode equals in der Klasse Object selbst ist die schärfste Möglichkeit, diese Vorschrift umzusetzen. 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 1 Vergleich von Zeichenketten Einf. Progr. (WS 08/09) 703

Exakter Vergleich von Zeichenketten Die Klasse String überschreibt equals so, dass für einen String s und ein Objekt o gilt: s.equals(o) g.d.w.: o ist nicht null o ist vom Typ String und o repräsentiert genau die gleiche Zeichenkette wie s (d.h. s und o haben gleiche Länge und an jeder Stelle steht der gleiche Character. Genügt die Implementierung von equals in der Klasse String der Vorschrift für die Implementierung, die in der Klasse Object gegeben ist? 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 1 Vergleich von Zeichenketten Einf. Progr. (WS 08/09) 704 Abgeschwächte Gleichheit von Zeichenketten Eine abgeschwächte Gleichheit auf Strings achtet nicht auf den Unterschied zwischen Klein- und Großbuchstaben: public boolean equalsignorecase(string anotherstring). Gleichheit am Anfang bzw. am Ende: public boolean startswith(string prefix) bzw. public boolean endswith(string suffix) Gleichheit des Inhalts mit anderen Objekten vom Typ CharSequence (also z.b. ein StringBuilder,einStringBuffer oder auch ein anderer String): public boolean contentequals(charsequence cs) 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 1 Vergleich von Zeichenketten Einf. Progr. (WS 08/09) 705

Überblick 17. Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 17.1 Vergleich von Zeichenketten 17.2 Das Interface Comparable<T> 17.3 Natürliche Ordnung von Zeichenketten 17.4 Pattern Matching 17.5 String-Darstellung von Objekten 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 2 Das Interface Comparable<T> Einf. Progr. (WS 08/09) 706 Natürliche Ordnung auf Objekten equals implementiert eine Äquivalenzrelation, wie wir gesehen haben, d.h. eine Relation, die reflexiv, symmetrisch und transitiv ist. Eine (partielle) Ordnung ist eine Relation, die reflexiv, transitiv und antisymmetrisch ist. Eine totale Ordnung ist eine partielle Ordnung, die außerdem total ist. Das Interface Comparable<T> definiert eine totale Ordnung R auf der Klasse T durch die Methode int compareto(t o) wie folgt: R T T mit (x, y) R x.compareto(y) <= 0 Wenn eine Klasse das Interface Comparable implementiert, nennt man diese durch compareto definierte totale Ordnung auch die natürliche Ordnung (natural ordering) der entsprechenden Klasse. 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 2 Das Interface Comparable<T> Einf. Progr. (WS 08/09) 707

Natürliche Ordnung auf Objekten Für zwei Objekte x und y vom Typ T implements Comparable<T> gilt: Der Ausdruck x.compareto(y) ist vom Typ int. Der Wert des Ausdrucks x.compareto(y) soll kleiner 0 sein, wenn x kleiner ist als y. Der Wert des Ausdrucks x.compareto(y) soll größer 0 sein, wenn x größer ist als y. Der Wert des Ausdrucks x.compareto(y) soll gleich 0 sein, wenn x gleich ist zu y. Diese Gleichheit (x.compareto(y)==0) soll normalerweise die gleiche Gleichheit sein, wie die von x.equals(y) angegebene, dies ist aber nicht notwendigerweise so. Achtung: Falls eine Klasse Comparable so implementiert, dass x.compareto(y)==0 x.equals(y), sollte in der Dokumentation deutlich darauf hingewiesen werden. Die empfohlene Bemerkung ist: Note: this class has a natural ordering that is inconsistent with equals. 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 2 Das Interface Comparable<T> Einf. Progr. (WS 08/09) 708 Überblick 17. Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 17.1 Vergleich von Zeichenketten 17.2 Das Interface Comparable<T> 17.3 Natürliche Ordnung von Zeichenketten 17.4 Pattern Matching 17.5 String-Darstellung von Objekten 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 3 Natürliche Ordnung von Zeichenketten Einf. Progr. (WS 08/09) 709

Lexikographischer Vergleich von Zeichenketten Die Klasse String implementiert Comparable<String>. Als natürliche Ordnung über Strings wird dabei die lexikographische Ordnung angenommen. Grundlage des Vergleichs ist der <-Operator, angewendet auf die einzelnen chars der beiden Strings. Wenn zwei Strings, s1 und s2, an einem Index oder mehreren Indices aus unterschiedlichen Charactern bestehen, dann ist der Wert von s1.compareto(s2) der Wert von s1.charat(k)-s2.charat(k), wobei k der kleinste der unterschiedlichen Indices ist. Unterscheiden sie sich an keiner Stelle, dann ist der Wert von s1.compareto(s2) der Wert von s1.length()-s2.length(). 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 3 Natürliche Ordnung von Zeichenketten Einf. Progr. (WS 08/09) 710 Lexikographischer Vergleich von Zeichenketten Auch für den lexikographischen Vergleich gibt es die Möglichkeit, große und kleine Buchstaben als gleich anzusehen. public int comparetoignorecase(string str) vergleicht zwei Strings wie compareto, nachdem auf jeden Character character die Anweisung Character.toLowerCase(Character.toUpperCase(character)) angewendet wurde. 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 3 Natürliche Ordnung von Zeichenketten Einf. Progr. (WS 08/09) 711

Überblick 17. Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 17.1 Vergleich von Zeichenketten 17.2 Das Interface Comparable<T> 17.3 Natürliche Ordnung von Zeichenketten 17.4 Pattern Matching 17.5 String-Darstellung von Objekten 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 4 Pattern Matching Einf. Progr. (WS 08/09) 712 Vergleich von Mustern Um ein Muster in einer Zeichenkette zu suchen, gibt es in der Klasse String z.b. die Methode public String replaceall(string regex, String replacement). Der Parameter regex definiert dabei einen sogenannten regulären Ausdruck. Eine andere hilfreiche Methode, die auf regulären Ausdrücken basiert, ist public String[] split(string regex). 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 4 Pattern Matching Einf. Progr. (WS 08/09) 713

Exkurs: Reguläre Ausdrücke Reguläre Ausdrücke sind ein mächtiges Werkzeug, um Muster in Zeichenketten zu beschreiben. Reguläre Ausdrücke sind auch von theoretischer Bedeutung für die Beschreibung bestimmter Typen von Sprachen. Als Werkzeug in konkreten Programmierproblemen sind reguläre Ausdrücke auch von immenser praktischer Bedeutung. In dieser Hinsicht werden sie aber im Studium kaum vertieft. Wir geben an dieser Stelle ein paar einführende Hinweise. 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 4 Pattern Matching Einf. Progr. (WS 08/09) 714 Exkurs: Reguläre Ausdrücke Definition Reguläre Ausdrücke sind wie folgt für ein Alphabet Σ (d.h. eine Menge von Symbolen, also z.b. alle möglichen Werte vom Typ char) wie folgt induktiv definiert: (= die leere Menge) ist ein regulärer Ausdruck. ε (= das leere Wort) ist ein regulärer Ausdruck. Für jedes a Σ ist a ein regulärer Ausdruck. Wenn a und b reguläre Ausdrücke sind, dann sind auch ab (Konkatenation) a b (Vereinigung) (a) (Stern-Operator), d.h. die durch den regulären Ausdruck a definierte Zeichenkette kann beliebig oft (auch 0-mal) hintereinander vorkommen. reguläre Ausdrücke. 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 4 Pattern Matching Einf. Progr. (WS 08/09) 715

Exkurs: Reguläre Ausdrücke Konstrukte für reguläre Ausdrücke Viele Programmiersprachen bieten Konstrukte an, um reguläre Ausdrücke zu definieren, die dann verwendet werden können, um spezielle Zeichenketten innerhalb von Zeichenketten zu finden. In Java gibt es z.b.: X für das Zeichen X. [abc] für die Zeichen a, b oder c. Mit den eckigen Klammern wird eine sogenannte Zeichenklasse definiert, entspricht der Vereinigung. Möglich ist z.b. auch [a-z] für alle Kleinbuchstaben. Abkürzungen für bestimmte Zeichenklassen, z.b.. für ein beliebiges Zeichen, \d für eine Ziffer (= [0-9]). Quantifier, die beschreiben, wie oft eine Zeichenkette hintereinander auftreten darf, z.b.: X* X kommt beliebig oft vor (0-mal oder öfter) X+ X kommt einmal oder öfter vor (= X(X)*) X{n} X kommt genau n-mal vor X{n,m} X kommt mindestens n-mal, höchstens m-mal vor X? X kommt 0 oder 1-mal vor 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 4 Pattern Matching Einf. Progr. (WS 08/09) 716 Exkurs: Reguläre Ausdrücke Pattern bilden Ein Konstrukt, das einen regulären Ausdruck beschreibt, kann man in einem String bilden. Aus einem solchen String kann man ein Objekt der Klasse Pattern bilden (durch die statischen Methoden Pattern.compile). In der Klasse Pattern sind die Möglichkeiten für reguläre Ausdrücke in Java ausführlich dokumentiert. Worauf matchen folgende Pattern? Pattern.compile("Kr(i o)ege(l r)") Pattern.compile("Info (I{1,3} IV)") 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 4 Pattern Matching Einf. Progr. (WS 08/09) 717

Pattern Matching Aus einem Pattern-Objekt p, das durch den String regex (Darstellung eines regulären Ausdrucks) definiert wurde, kann man ein Matcher-Objekt mstr spezifisch für einen String str erzeugen, um das Pattern p in str zu finden, zu ersetzen usw. Nun können Sie das Verhalten der String-Methode public String replaceall(string regex, String replacement) verstehen, die eine Abkürzung für folgende Befehle ist: Pattern p = Pattern.compile(regex); Matcher mstr = p.matcher(str); String neuerstring = mstr.replaceall(replacement); // oder auch: String neuerstring2 = Pattern.compile(regex).matcher(str).replaceAll(replacement); Damit ist nicht-exakte Suche mit Mustern in Strings möglich, das sogenannte Pattern Matching. 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 4 Pattern Matching Einf. Progr. (WS 08/09) 718 Überblick 17. Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 17.1 Vergleich von Zeichenketten 17.2 Das Interface Comparable<T> 17.3 Natürliche Ordnung von Zeichenketten 17.4 Pattern Matching 17.5 String-Darstellung von Objekten 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 5 String-Darstellung von Objekten Einf. Progr. (WS 08/09) 719

String-Darstellung von Objekten Die Klasse Object definiert eine Instanzen-Methode public String tostring(), die eine String-Repräsentation des Objektes zurückgibt. In Object ist dies eine Zeichenfolge zusammengesetzt aus dem Klassen-Namen, dem @-Zeichen und der Hexadezimal-Darstellung des Hash-Codes des Objektes, der für Objekte vom Typ Object aus der internen Speicherdarstellung erzeugt wird. (Die eigentliche Bedeutung des Hash-Codes lernen wir später kennen.) Da jede Klasse eine Unterklasse von Object ist, hat auch jedes Objekt von beliebigem Typ diese Fähigkeit, eine String-Repräsentation von sich zu geben. Wie wir in den Übungen bereits gesehen haben, kann man für eine bestimmte Klasse eine andere (und möglicherweise sinnvollere) Repräsentation implementieren. 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 5 String-Darstellung von Objekten Einf. Progr. (WS 08/09) 720 String-Darstellung von Objekten Beispiele: Ein Objekt vom Typ StringBuilder gibt den Inhalt der internen Zeichenkette als String zurück. Ein Objekt vom Typ Double gibt eine String-Repräsentation der dargestellten Zahl zurück. Diese Methode wird oftmals implizit aufgerufen, z.b., wenn man der Methode System.out.println(Object x) ein Objekt übergibt. 17 Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T> 5 String-Darstellung von Objekten Einf. Progr. (WS 08/09) 721