Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger. 
Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Objektorientierte Beziehungsfragen
7 Ausnahmen müssen sein
8 Äußere.innere Klassen
9 Besondere Typen der Java SE
10 Generics<T>
11 Lambda-Ausdrücke und funktionale Programmierung
12 Architektur, Design und angewandte Objektorientierung
13 Komponenten, JavaBeans und Module
14 Die Klassenbibliothek
15 Einführung in die nebenläufige Programmierung
16 Einführung in Datenstrukturen und Algorithmen
17 Einführung in grafische Oberflächen
18 Einführung in Dateien und Datenströme
19 Einführung ins Datenbankmanagement mit JDBC
20 Einführung in <XML>
21 Testen mit JUnit
22 Bits und Bytes und Mathematisches
23 Die Werkzeuge des JDK
A Java SE-Paketübersicht
Stichwortverzeichnis


Download:

- Beispielprogramme, ca. 35,4 MB


Buch bestellen
Ihre Meinung?



Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenboom

Einführung, Ausbildung, Praxis
Buch: Java ist auch eine Insel


Java ist auch eine Insel

Pfeil 4 Der Umgang mit Zeichenketten
Pfeil 4.1 Von ASCII über ISO-8859-1 zu Unicode
Pfeil 4.1.1 ASCII
Pfeil 4.1.2 ISO/IEC 8859-1
Pfeil 4.1.3 Unicode
Pfeil 4.1.4 Unicode-Zeichenkodierung
Pfeil 4.1.5 Escape-Sequenzen/Fluchtsymbole
Pfeil 4.1.6 Schreibweise für Unicode-Zeichen und Unicode-Escapes
Pfeil 4.1.7 Java-Versionen gehen mit Unicode-Standard Hand in Hand *
Pfeil 4.2 Die Character-Klasse
Pfeil 4.2.1 Ist das so?
Pfeil 4.2.2 Zeichen in Großbuchstaben/Kleinbuchstaben konvertieren
Pfeil 4.2.3 Ziffern einer Basis *
Pfeil 4.3 Zeichenfolgen
Pfeil 4.4 Die Klasse String und ihre Methoden
Pfeil 4.4.1 String-Literale als String-Objekte für konstante Zeichenketten
Pfeil 4.4.2 Konkatenation mit +
Pfeil 4.4.3 String-Länge und Test auf Leer-String
Pfeil 4.4.4 Zugriff auf ein bestimmtes Zeichen mit charAt(int)
Pfeil 4.4.5 Nach enthaltenen Zeichen und Zeichenfolgen suchen
Pfeil 4.4.6 Das Hangman-Spiel
Pfeil 4.4.7 Gut, dass wir verglichen haben
Pfeil 4.4.8 String-Teile extrahieren
Pfeil 4.4.9 Strings anhängen, zusammenfügen, Groß-/Kleinschreibung und Leerraum
Pfeil 4.4.10 Gesucht, gefunden, ersetzt
Pfeil 4.4.11 String-Objekte mit Konstruktoren erzeugen *
Pfeil 4.5 Veränderbare Zeichenketten mit StringBuilder und StringBuffer
Pfeil 4.5.1 Anlegen von StringBuilder-/StringBuffer-Objekten
Pfeil 4.5.2 StringBuilder/StringBuffer in andere Zeichenkettenformate konvertieren
Pfeil 4.5.3 Zeichen(folgen) erfragen
Pfeil 4.5.4 Daten anhängen
Pfeil 4.5.5 Zeichen(folgen) setzen, löschen und umdrehen
Pfeil 4.5.6 Länge und Kapazität eines StringBuilder-/StringBuffer-Objekts *
Pfeil 4.5.7 Vergleichen von String mit StringBuilder und StringBuffer
Pfeil 4.5.8 hashCode() bei StringBuilder/StringBuffer *
Pfeil 4.6 CharSequence als Basistyp
Pfeil 4.7 Konvertieren zwischen Primitiven und Strings
Pfeil 4.7.1 Unterschiedliche Typen in String-Repräsentationen konvertieren
Pfeil 4.7.2 String-Inhalt in einen primitiven Wert konvertieren
Pfeil 4.7.3 String-Repräsentation im Format Binär, Hex, Oktal *
Pfeil 4.7.4 parseXXX(…)- und printXXX()-Methoden in DatatypeConverter *
Pfeil 4.8 Strings zusammenhängen (konkatenieren)
Pfeil 4.8.1 Strings mit StringJoiner
Pfeil 4.9 Zerlegen von Zeichenketten
Pfeil 4.9.1 Splitten von Zeichenketten mit split(…)
Pfeil 4.9.2 Yes we can, yes we scan – die Klasse Scanner
Pfeil 4.10 Ausgaben formatieren
Pfeil 4.10.1 Formatieren und Ausgeben mit format()
Pfeil 4.11 Zum Weiterlesen
 

Zum Seitenanfang

4.9Zerlegen von Zeichenketten Zur vorigen ÜberschriftZur nächsten Überschrift

Die Java-Bibliothek bietet einige Klassen und Methoden, mit denen wir nach bestimmten Mustern große Zeichenketten in kleinere zerlegen können. In diesem Kontext sind die Begriffe Token und Delimiter zu nennen: Ein Token ist ein Teil eines Strings, den bestimmte Trennzeichen (engl. delimiter) von anderen Tokens trennen. Nehmen wir als Beispiel den Satz »Moderne Musik ist Instrumentespielen nach Noten« (Peter Sellers). Wählen wir Leerzeichen als Trennzeichen, lauten die einzelnen Tokens »Moderne«, »Musik« usw.

Die Java-Bibliothek bietet eine Reihe von Möglichkeiten zum Zerlegen von Zeichenfolgen, von denen die zwei ersten in den nachfolgenden Abschnitten vorgestellt werden:

  • split(…) von String: Aufteilen mit einem Delimiter, den ein regulärer Ausdruck beschreibt

  • Scanner: schöne Klasse zum Ablaufen einer Eingabe

  • StringTokenizer: der Klassiker aus Java 1.0. Delimiter sind nur einzelne Zeichen.

  • BreakIterator: Findet Zeichen-, Wort-, Zeilen- oder Satz-Grenzen.

  • Matcher in Zusammenhang mit der Pattern-Klasse zerlegt mithilfe von regulären Ausdrücken.

Die Methoden und Klassen sind sozusagen die Gegenspieler der Konkatenationsmöglichkeiten: split(…) steht join(…) gegenüber, StringTokenizer dem StringJoiner.

 

Zum Seitenanfang

4.9.1Splitten von Zeichenketten mit split(…) Zur vorigen ÜberschriftZur nächsten Überschrift

Die Objektmethode split(…) eines String-Objekts zerlegt die eigene Zeichenkette in Teilzeichenketten. Die Trenner sind völlig frei wählbar und als regulärer Ausdruck beschrieben. Die Rückgabe ist ein Array bzw. ein Iterable mit Teilzeichenketten.

[zB]Beispiel

Zerlege einen Domain-Namen in seine Bestandteile:

String path = "www.tutego.com";

String[] segs = path.split( Pattern.quote( "." ) );

System.out.println( Arrays.toString(segs) ); // [www, tutego, com]

Da der Punkt als Trennzeichen ein Sonderzeichen für reguläre Ausdrücke ist, muss er passend mit dem Backslash auskommentiert werden. Das erledigt die statische Methode Pattern.quote(String), die einen »entschärften« Regex-String zurückgibt. Andernfalls liefert split(".") auf jedem String ein Array der Länge 0.

Ein häufiger Trenner ist \s, also Weißraum.

[zB]Beispiel

Zähle die Anzahl der Wörter in einem Satz:

String string = "Hört es euch an, denn das ist mein Gedudel!";

int nrOfWords = string.split( "(\\s|\\p{Punct})+" ).length;

System.out.println( nrOfWords ); // 9

Der Trenner ist entweder Weißraum oder ein Satzeichen.

final class java.lang.String

implements CharSequence, Comparable<String>, Serializable
  • String[] split(String regex)

    Zerlegt die aktuelle Zeichenkette mit dem regulären Ausdruck.

  • String[] split(String regex, int limit)

    Zerlegt die aktuelle Zeichenkette mit dem regulären Ausdruck, liefert jedoch maximal begrenzt viele Teilzeichenfolgen.

 

Zum Seitenanfang

4.9.2Yes we can, yes we scan – die Klasse Scanner Zur vorigen ÜberschriftZur nächsten Überschrift

Die Klasse java.util.Scanner kann eine Zeichenkette in Tokens zerlegen und einfache Dateien zeilenweise einlesen. Bei der Zerlegung kann ein regulärer Ausdruck den Delimiter beschreiben. Damit ist Scanner flexibler als ein StringTokenizer, der nur einzelne Zeichen als Trenner zulässt.

Aufbauen eines Scanners

Zum Aufbau der Scanner-Objekte bietet die Klasse einige Konstruktoren an, die die zu zerlegenden Zeichenfolgen unterschiedlichen Quellen entnehmen, etwa einem String, einem Datenstrom (beim Einlesen von der Kommandozeile ist das System.in), einem File-Objekt oder diversen NIO-Objekten. Falls ein Objekt vom Typ Closeable dahintersteckt, wie ein Writer, sollte mit close() der Scanner geschlossen werden, der das close() zum Closeable weiterleitet. Beim String ist das nicht nötig, und bei File schließt der Scanner selbstständig.

final class java.util.Scanner

implements Iterator<String>, Closeable
  • Scanner(String source)

  • Scanner(Path source)

  • Scanner(Path source, String charsetName)

  • Scanner(File source)

  • Scanner(File source, String charsetName)

  • Scanner(InputStream source)

  • Scanner(InputStream source, String charsetName)

  • Scanner(Readable source)

  • Scanner(ReadableByteChannel source)

  • Scanner(ReadableByteChannel source, String charsetName)

    Erzeugt ein neues Scanner-Objekt aus diversen Quellen.

Zeilenweises Einlesen einer Datei

Ist das Scanner-Objekt angelegt, lässt sich mit dem Paar hasNextLine() und nextLine() einfach eine Datei zeilenweise auslesen:

Listing 4.13ReadAllLines.java

import java.io.File;

import java.io.FileNotFoundException;

import java.util.Scanner;

public class ReadAllLines {

public static void main( String[] args ) throws FileNotFoundException {

try ( Scanner scanner = new Scanner( Paths.get( "EastOfJava.txt" ),

StandardCharsets.ISO_8859_1.name() ) ) {

while ( scanner.hasNextLine() )

System.out.println( scanner.nextLine() );

}

}

}

Da der Konstruktor von Scanner mit der Datei eine Ausnahme auslösen kann, müssen wir diesen möglichen Fehler behandeln. Wir machen es uns einfach und leiten einen möglichen Fehler an die Laufzeitumgebung weiter. Die Konstruktion mit try (…) { } nennt sich try mit Ressourcen und schließt automatisch die Datei nach dem Nutzen. Den Umgang mit Exceptions und das besondere try erklärt beides Kapitel 7, »Ausnahmen müssen sein«, genauer. Auch sollte immer die Kodierung angegeben werden, was in unserem Fall ISO 8859-1, also Latin-1 ist. Der Kodierungs-String, der für den Scanner-Kontruktor nötig ist, stammt von einer Konstante aus StandardCharsets.

final class java.util.Scanner

implements Iterator<String>, Closeable
  • boolean hasNextLine()

    Liefert true, wenn eine nächste Zeile gelesen werden kann.

  • String nextLine()

    Liefert die nächste Zeile.

Der Nächste, bitte

Nach dem Erzeugen des Scanner-Objekts liefert die Methode next() die nächste Zeichenfolge, wenn denn ein hasNext() die Rückgabe true ergibt. (Das sind dann auch die Methoden der Schnittstelle Iterator, wobei remove() nicht implementiert ist.)

[zB]Beispiel

Von der Standardeingabe soll ein String gelesen werden:

Scanner scanner = new Scanner( System.in );

String s = scanner.next();

Neben der next()-Methode, die nur einen String als Rückgabe liefert, bietet Scanner diverse next<Typ>()-Methoden an, die das nächste Token einlesen und in ein gewünschtes Format konvertieren, etwa in ein double bei nextDouble(). Über gleich viele hasNext<Typ>()-Methoden lässt sich erfragen, ob ein weiteres Token von diesem Typ folgt.

[zB]Beispiel

Die einzelnen nextXXX()- und hasNextXXX()-Methoden in einem Beispiel:

Listing 4.14ScannerDemo.java, main()

Scanner scanner = new Scanner( "tutego 12 1973 12,03 True 123456789000" );

System.out.println( scanner.hasNext() ); // true

System.out.println( scanner.next() ); // tutego

System.out.println( scanner.hasNextByte() ); // true

System.out.println( scanner.nextByte() ); // 12

System.out.println( scanner.hasNextInt() ); // true

System.out.println( scanner.nextInt() ); // 1973

System.out.println( scanner.hasNextDouble() ); // true

System.out.println( scanner.nextDouble() ); // 12.03

System.out.println( scanner.hasNextBoolean() ); // true

System.out.println( scanner.nextBoolean() ); // true

System.out.println( scanner.hasNextLong() ); // true

System.out.println( scanner.nextLong() ); // 123456789000

System.out.println( scanner.hasNext() ); // false

Sind nicht alle Tokens interessant, überspringt Scanner skip(Pattern pattern) bzw. Scanner skip(String pattern) sie – Delimiter werden nicht beachtet.

final class java.util.Scanner

implements Iterator<String>, Closeable
  • boolean hasNext()

  • boolean hasNextBigDecimal()

  • boolean hasNextBigInteger()

  • boolean hasNextBigInteger(int radix)

  • boolean hasNextBoolean()

  • boolean hasNextByte()

  • boolean hasNextByte(int radix)

  • boolean hasNextDouble()

  • boolean hasNextFloat()

  • boolean hasNextInt()

  • boolean hasNextInt(int radix)

  • boolean hasNextLong()

  • boolean hasNextLong(int radix)

  • boolean hasNextShort()

  • boolean hasNextShort(int radix)

    Liefert true, wenn ein Token des gewünschten Typs gelesen werden kann.

  • String next()

  • BigDecimal nextBigDecimal()

  • BigInteger nextBigInteger()

  • BigInteger nextBigInteger(int radix)

  • boolean nextBoolean()

  • byte nextByte()

  • byte nextByte(int radix)

  • double nextDouble()

  • float nextFloat()

  • int nextInt()

  • int nextInt(int radix)

  • long nextLong()

  • long nextLong(int radix)

  • short nextShort()

  • short nextShort(int radix)

    Liefert das nächste Token.

Die Methode useRadix(int) ändert die Basis für Zahlen, und radix() erfragt sie.

 


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück

 

 


Copyright © Rheinwerk Verlag GmbH 2017

Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 

[Rheinwerk Computing]



Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de