Objektorientierte Programmierung. Kapitel 10: Strings

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

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Probeklausur: Programmierung WS04/05

Objektorientierte Programmierung. Kapitel 12: Interfaces

Computeranwendung und Programmierung (CuP)

Repetitorium Informatik (Java)

Einführung in die Java- Programmierung

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

5. Tutorium zu Programmieren

Probeklausur: Programmierung WS04/05

Übersicht. Vorstellung des OO-Paradigmas

Einstieg in die Informatik mit Java

Java: Vererbung. Teil 3: super()

Objektorientierte Programmierung

Objektorientierte Programmierung

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Zeichenketten (Strings) in C

5.4 Klassen und Objekte

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

1. Erläutern Sie die Aufgaben von Datentypen in der imperativen Programmierung.

Enum Aufzählungstypen in Java

Java Generics & Collections

4 Objektorientierte Programmierung mit Java 4.1 Java-Grundlagen

C# im Vergleich zu Java

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Java Kurs für Anfänger Einheit 2 Datentypen und Operationen

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

1 Polymorphie (Vielgestaltigkeit)

Primitive Datentypen

Algorithmen und Datenstrukturen

Ein erstes Java-Programm

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Formale Sprachen und Automaten

Theorie zu Übung 8 Implementierung in Java

Aufgabe 1. »Programmieren«, WS 2006/2007. Nino Simunic M.A.

Tutorium Java Ein Überblick. Helge Janicke

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Programmierkurs Java

Universität Augsburg, Institut für Informatik Sommersemester 2005 Prof. Dr. Werner Kießling 15. Oktober 2005 Dr. Alfons Huhn, Timotheus Preisinger

Kapitel 6. Vererbung

2. Methoden. n Generelles zum Aufruf von Methoden. n Parameterübergabemechanismen (call by value, call by reference)

Klassenbeziehungen & Vererbung

Datenbankanwendungsprogrammierung Crashkurs Java

Einführung in die Informatik

Javakurs für Anfänger

Prof. W. Henrich Seite 1

Innere Klassen in Java

Vererbung. Martin Wirsing. Ziele. Vererbung

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Objektorientierte Programmierung

Kapitel 6. Vererbung

Primitive Datentypen und Felder (Arrays)

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Bibliotheken (Java API)

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Kapitel 6. Vererbung

Effiziente Java Programmierung

3 Klassen, Attribute, Methoden

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Java Einführung Klassendefinitionen

Vorlesung 09: Mengen. Peter Thiemann SS 2010

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Vererbung & Schnittstellen in C#

Propädeutikum zur Programmierung

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Einführung in die Java- Programmierung

Prinzipien Objektorientierter Programmierung

Einführung in die Programmierung

5 Codierung nach RSA (Lösung)

Repräsentation von Daten Binärcodierung von rationalen Zahlen und Zeichen

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

9 Zeiger (Pointer). Dynamischer Speicher

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung

Überschreiben von Methoden

Über den Autor 7. Teil I Los geht s mit Java für die Android-Entwicklung 25. Kapitel 1 Alles über Java und Android 27

JAVA - Methoden

5.5.8 Öffentliche und private Eigenschaften

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Einführung in die Programmierung für Wirtschaftsinformatik

DB2 Codepage Umstellung

Einführung in die Java- Programmierung

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Hochschule Darmstadt Fachbereich Informatik

Programmieren in C. Die C-Standardbibliothek. Prof. Dr. Nikolaus Wulff

Programmieren in C. Operatoren, Variablen und deren Sichtbarkeit. Prof. Dr. Nikolaus Wulff

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

2.2 Prozesse in Java

3 Objektorientierte Konzepte in Java

J.5 Die Java Virtual Machine

Einführung in die Java- Programmierung

Testen mit JUnit. Motivation

Liste Programmieren Java Überblick

Dr. Monika Meiler. Inhalt

PIWIN 1 Übung Blatt 5

Transkript:

10. Strings 1/16 Objektorientierte Programmierung Kapitel 10: Strings Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

10. Strings 2/16 Inhalt 1 Einführung 2 StringBuilder

10. Strings 3/16 Strings (1) String-Konstanten wie "abc" wurden in Kapitel 4 behandelt. Insbesondere wurden da auch die Escape-Sequenzen (wie \n) behandelt, mit denen man spezielle Zeichen in die Zeichenketten einbetten kann. Der Compiler erzeugt für Zeichenketten-Konstanten Objekte der Klasse String (genauer java.lang.string). Diese Bibliotheks-Klasse hat eine große Anzahl von Methoden, die unter unter folgender Webadresse dokumentiert sind: [http://docs.oracle.com/javase/6/docs/api/java/lang/string.html] Außer den Konstanten sind noch der Konkatenations-Operator + und die Methode tostring in die Sprache Java eingebaut. Für eigene Klassen kann man keine Operatoren definieren (in C++ schon). Ansonsten ist es eine normale Klasse.

10. Strings 4/16 Folgen von Zeichen: Strings (2) Strings sind recht ähnlich zu char[]-arrays. Man kann die Länge eines Strings s abfragen mit s.length() Achtung: Hier Methode (erfordert () für Parameter), bei Arrays Attribut. Mögliche Erklärung: Man wollte gleiches Interface wie StringBuilder (s.u.), dort Länge variabel, also ging final Attribut nicht, Attr. ohne final unsicher. Ein Zeichen des Strings bekommt man mit s.charat(i) Dabei muss i wie bei Arrays einen Wert haben zwischen 0 (für das erste Zeichen) und s.length() - 1 (für das letzte Zeichen). "abc".charat(i) wäre legal (mit 0 i 2). "abc" ist ja ein Objekt der Klasse String.

10. Strings 5/16 Vergleich von Strings: Strings (3) Wenn man Strings mit == vergleicht, wird wie üblich nur getestet, ob es sich um das gleiche Objekt handelt. Es wird nicht der Inhalt des Strings verglichen, d.h. die Zeichenfolge. Z.B. wäre "abc" == "a" + "bc" falsch. Für im Programm direkt als Konstanten vorkommende Zeichenketten (String-Literale) ist garantiert, dass der Compiler für jede Zeichenkette nur ein String-Objekt erzeugt, dort würde der Vergleich mit == funktionieren. Wenn man einen String s1 berechnet hat (z.b. durch Konkatenation), kann man mit s1.intern() ein kanonisches Objekt dafür bekommen. Der Vergleich zweier Strings funktioniert sicher mit s1.equals(s2) Diese Methode liefert einen Wahrheitswert (Typ boolean), und zwar true, wenn beide String-Objekte die gleiche Zeichenfolge repräsentieren, sonst false.

10. Strings 6/16 Sortierung von Strings: Strings (4) Der Aufruf s1.compareto(s2) liefert einen negativen Wert, wenn s1 lexikographisch vor s2 kommt, 0, wenn beide gleich sind, d.h. s1.equals(s2) einen positiven Wert, wenn s1 nach s2 kommt. Dabei werden die einzelnen Zeichen nach Unicode-Werten geordnet, was nicht die übliche alphabetische Anordnung ist. Diese ist Länder-spezifisch. Für eine deutsche Sortierung verwendet man java.util.locale german = new java.util.locale("de"); java.text.collation coll = java.text.collatoion.getinstance(german); (Alternativ gibt es java.util.locator.german, und getinstance() verwendet die default Locale.) Dann Vergleich mit coll.compare(s1, s2).

10. Strings 7/16 Strings (5) Erzeugung von Strings: Man kann einen String aus einem Zeichen-Array erzeugen: char[] array = { a, b, c }; String s = new String(array); Man kann einen String auch aus byte[] erzeugen, dann muss man aber einen Zeichensatz angeben, oder sich auf den Default-Zeichensatz verlassen. Man kann beliebige Typen mit der statischen Methode valueof umwandeln, z.b. String s = String.valueOf(123); Ein bestimmtes Format bekommt man mit String s = String.format("%4.1f", 1.23); Vier Zeichen insgesamt (inklusive, ), eine Dezimalstelle nach dem Komma.

10. Strings 8/16 Strings (6) Beispiele für weitere nützliche Methoden von String: int indexof(int c): Index des ersten Vorkommens des Zeichens c. Z.B. würde nach String s = "abc"; der Aufruf s.indexof( b ) den Wert 1 liefern. -1 wird geliefert, wenn das Zeichen nicht vorkommt. Der Typ ist int, weil es auch mit Unicode Code Points funktioniert (s.u.). Alle diese Methoden gibt es auch in einer Variante mit ganzen Strings statt einzelnen Zeichen (Suche nach Substrings): "abcdcd".indexof("cd") == 2 int indexof(int c, int i): Index des nächsten Vorkommens von c ab Position i. Die Suche beginnt an der Index-Position i (einschließlich). Es gibt keinen Fehler, wenn i zu groß ist, dann wird -1 geliefert. int lastindexof(int c): Index des letzten Vorkommens.

10. Strings 9/16 Strings (7) Beispiele für weitere nützliche Methoden von String, Forts.: String substring(int start, int end): Teilzeichenkette extrahieren. Die Zeichenkette beginnt bei Index start und endet bei end-1. Bis zum Ende der Eingabezeichenkette s kommt man also mit end = s.length(). String tolowercase(): Umwandlung in Kleinbuchstaben. Entsprechend liefert touppercase() den String in Großbuchstaben. Die Methode trim() entfernt Leerplatz an Anfang und Ende. String replace(char c1, char c2): Ersetzt alle Vorkommen von c1 durch c2. Es gibt auch eine Variante mit Strings (oder, noch allgemeiner, CharSequence-Werten). Bei replaceall und replacefirst kann man ein Muster (regulären Ausdruck) für den zu ersetzenden Text angeben.

10. Strings 10/16 Strings: Unicode-Unterstützung (1) Strings sind genauer Folgen von UTF-16 Code Units. Unicode-Zeichen haben Code Points zugeordnet, die int-werte sind (bis 0x10FFFF). Dies ist der eigentliche Zeichencode. Viele Programmierer kümmern sich nicht um diese Unterscheidung, für die häufigsten Sprachen funktioniert es, und wenn man nur Texte ausgibt, ist die genaue Anzahl Zeichen meist nicht wichtig. In UTF-16 werden viele Zeichen mit 16 Bit codiert (z.b. alle ASCII-Zeichen und deutsche Umlaute), aber es gibt auch Zeichen, die zwei aufeinanderfolgende 16-Bit Einheiten (char-werte) benötigen. Diese Teile heissen High-Surrogate ( \ud800 bis \udbff ) und Low-Surrogate ( \udc00 bis \udfff ). In diesen Bereichen liegen keine normalen Zeichen. Jeder Teil enthält 10 Bit, man muss sie wieder zusammenfügen und 2 16 = 65536 addieren, um den Code Point zu bekommen.

10. Strings 11/16 Strings: Unicode-Unterstützung (2) Folgende Methode liefert den echten Zeichencode an einer Position (ggf. zusammengesetzt aus zwei char-werten): int codepointat(int index) Die Anzahl tatsächlicher Zeichen zwischen zwei Index-Positionen in einem String erhält man mit int codepointcount(int begin, int end) Wenn man z.b. begin = 0 und end = s.length() setzt, erhält man die tatsächliche Länge des Strings in Zeichen (im Gegensatz zur Länge in 16-Bit Code Units, die length() liefert). Die Klasse Character enthält einige (statische) Hilfsfunktionen für die Arbeit mit Code Points, z.b. liefert static int charcount(int codepoint) die Anzahl der char-werte für einen Zeichencode (1 oder 2).

10. Strings 12/16 Inhalt 1 Einführung 2 StringBuilder

10. Strings 13/16 StringBuilder (1) Objekte der Klasse String sind nach der Erzeugung unveränderlich. Will man einen String konstruieren, so kann man dazu ein Objekt der Klasse StringBuilder verwenden. Die Klasse StringBuffer hat die gleiche Schnittstelle, und ist sicher für parallele Zugriffe aus mehreren Threads, deswegen aber nicht ganz so effizient. Wenn nur ein Thread darauf zugreifen muss, wird die Klasse StringBuilder empfohlen, die mit Java 5 eingeführt wurde. Natürlich kann man einen String auch Zeichen für Zeichen durch Konkatenation mit + aufbauen, das wäre aber nicht effizient (Verschwendung von Laufzeit und Speicherplatz). Es wird jedesmal ein neues String-Objekt konstruiert, das der Garbage Collector später wieder einsammeln muss. Es ist damit zu rechnen, das jedes Mal der bisherige String kopiert wird.

10. Strings 14/16 StringBuilder (2) Man kann ein Objekt dieser Klasse z.b. erzeugen mit StringBuilder s = new StringBuilder(80); Dabei ist 80 die initiale Kapazität, also die Größe des Zeichen-Arrays in dem StringBuilder-Objekt. Wenn die Größe später nicht reichen sollte, wird sie automatisch erweitert, aber das kostet natürlich Laufzeit. Es muss ein neues, größeres Array angefordert werden und die Zeichen müssen vom alten in das neue Array umkopiert werden. Der Garbage Collector muss das alte Array wieder einsammeln. Andererseits kostet ein viel zu großes Array Speicherplatz. Nach der Erzeugung enthält der StringBuilder zunächst den leeren String "".

10. Strings 15/16 StringBuilder (3) Der in einem StringBuilder s gespeicherte String kann geändert werden z.b. mit s.append("abc"); Hiermit wird der String "abc" hinten an den bereits gespeicherten String (initial "") angehängt. Die Methode append akzeptiert beliebige Typen, die ggf. in Strings umgewandelt werden (formal handelt es sich um mehrere Methoden mit gleichem Namen aber unterschiedlichen Argument-Typen). Man kann einen String (oder einen beliebigen Wert) in den gespeicherten String auch an beliebiger Stelle einfügen: s.insert(1, "de") Wenn in s vorher der String "abc" gespeichert war, steht dort jetzt der String "adebc", d.h. "de" wurde an der Index-Position 1 eingefügt, was dort vorher stand, wurde nach hinten verschoben.

10. Strings 16/16 StringBuilder (4) StringBuilder hat auch die von String bekannten Methoden charat und length(). Das ist kein Zufall, sondern liegt an dem Interface CharSequence, das von beiden Klassen implementiert wird. Interfaces werden in Kapitel 12 behandelt. Dabei liefert die Methode length() die aktuell in dem StringBuilder gespeicherte Zeichenzahl (char-werte). Und nicht die Kapazität. Diese erhält man mit capacity(). Mit tostring() erhält man ein String-Objekt zum aktuellen Inhalt des StringBuilders. Der String ist unveränderlich und damit unabhängig von eventuellen zukünftigen Änderungen des StringBuilder-Objektes. Die Klasse String hat auch einen Konstruktor mit einem StringBuilder als Parameter.