Rheinwerk Computing < openbook >


 
Inhaltsverzeichnis
Materialien
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Arrays und ihre Anwendungen
5 Der Umgang mit Zeichenketten
6 Eigene Klassen schreiben
7 Objektorientierte Beziehungsfragen
8 Ausnahmen müssen sein
9 Geschachtelte Typen
10 Besondere Typen der Java SE
11 Generics<T>
12 Lambda-Ausdrücke und funktionale Programmierung
13 Architektur, Design und angewandte Objektorientierung
14 Java Platform Module System
15 Die Klassenbibliothek
16 Einführung in die nebenläufige Programmierung
17 Einführung in Datenstrukturen und Algorithmen
18 Einführung in grafische Oberflächen
19 Einführung in Dateien und Datenströme
20 Einführung ins Datenbankmanagement mit JDBC
21 Bits und Bytes, Mathematisches und Geld
22 Testen mit JUnit
23 Die Werkzeuge des JDK
A Java SE-Module und Paketübersicht
Stichwortverzeichnis


Download:

- Listings, ca. 2,7 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

Pfeil5 Der Umgang mit Zeichenketten
Pfeil5.1 Von ASCII über ISO-8859-1 zu Unicode
Pfeil5.1.1 ASCII
Pfeil5.1.2 ISO/IEC 8859-1
Pfeil5.1.3 Unicode
Pfeil5.1.4 Unicode-Zeichenkodierung
Pfeil5.1.5 Escape-Sequenzen/Fluchtsymbole
Pfeil5.1.6 Schreibweise für Unicode-Zeichen und Unicode-Escapes
Pfeil5.1.7 Java-Versionen gehen mit dem Unicode-Standard Hand in Hand *
Pfeil5.2 Datentypen für Zeichen und Zeichenfolgen
Pfeil5.3 Die Character-Klasse
Pfeil5.3.1 Ist das so?
Pfeil5.3.2 Zeichen in Großbuchstaben/Kleinbuchstaben konvertieren
Pfeil5.3.3 Vom Zeichen zum String
Pfeil5.3.4 Von char in int: vom Zeichen zur Zahl *
Pfeil5.4 Zeichenfolgen
Pfeil5.5 Die Klasse String und ihre Methoden
Pfeil5.5.1 String-Literale als String-Objekte für konstante Zeichenketten
Pfeil5.5.2 Konkatenation mit +
Pfeil5.5.3 String-Länge und Test auf Leer-String
Pfeil5.5.4 Zugriff auf ein bestimmtes Zeichen mit charAt(int)
Pfeil5.5.5 Nach enthaltenen Zeichen und Zeichenfolgen suchen
Pfeil5.5.6 Das Hangman-Spiel
Pfeil5.5.7 Gut, dass wir verglichen haben
Pfeil5.5.8 String-Teile extrahieren
Pfeil5.5.9 Strings anhängen, zusammenfügen, Groß-/Kleinschreibung und Weißraum
Pfeil5.5.10 Gesucht, gefunden, ersetzt
Pfeil5.5.11 String-Objekte mit Konstruktoren und aus Wiederholungen erzeugen *
Pfeil5.6 Veränderbare Zeichenketten mit StringBuilder und StringBuffer
Pfeil5.6.1 Anlegen von StringBuilder-Objekten
Pfeil5.6.2 StringBuilder in andere Zeichenkettenformate konvertieren
Pfeil5.6.3 Zeichen(folgen) erfragen
Pfeil5.6.4 Daten anhängen
Pfeil5.6.5 Zeichen(folgen) setzen, löschen und umdrehen
Pfeil5.6.6 Länge und Kapazität eines StringBuilder-Objekts *
Pfeil5.6.7 Vergleich von StringBuilder-Exemplaren und Strings mit StringBuilder
Pfeil5.6.8 hashCode() bei StringBuilder *
Pfeil5.7 CharSequence als Basistyp
Pfeil5.8 Konvertieren zwischen Primitiven und Strings
Pfeil5.8.1 Unterschiedliche Typen in String-Repräsentationen konvertieren
Pfeil5.8.2 String-Inhalt in einen primitiven Wert konvertieren
Pfeil5.8.3 String-Repräsentation im Format Binär, Hex und Oktal *
Pfeil5.8.4 parseXXX(…)- und printXXX()-Methoden in DatatypeConverter *
Pfeil5.9 Strings zusammenhängen (konkatenieren)
Pfeil5.9.1 Strings mit StringJoiner zusammenhängen
Pfeil5.10 Zerlegen von Zeichenketten
Pfeil5.10.1 Splitten von Zeichenketten mit split(…)
Pfeil5.10.2 Yes we can, yes we scan – die Klasse Scanner
Pfeil5.11 Ausgaben formatieren
Pfeil5.11.1 Formatieren und Ausgeben mit format()
Pfeil5.12 Zum Weiterlesen
 

Zum Seitenanfang

5.10    Zerlegen 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. Die ersten beiden aus dieser Liste werden in den nachfolgenden Abschnitten vorgestellt:

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

  • lines() von String: Liefert einen Stream<String> von Zeilen.

  • Scanner: schöne Klasse zum Ablaufen einer Eingabe, auch zeilenweise

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

  • BreakIterator: Findet Zeichen-, Wort-, Zeilen- oder Satzgrenzen.

  • Matcher: In Zusammenhang mit der Pattern-Klasse zerlegt Matcher Zeichenfolgen 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

5.10.1    Splitten 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 Satzzeichen. Alternativ kann auch der Ausdruck "[\\s\\p{Punct}]+" eingesetzt werden.

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

5.10.2    Yes 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 Path-Objekt oder diversen anderen Eingabequellen. 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.

final class java.util.Scanner

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

  • Scanner(Path source) throws IOException

  • Scanner(Path source, String charsetName) throws IOException

  • Scanner(Path source, Charset charset) throws IOException (seit Java 10)

  • Scanner(File source) throws FileNotFoundException

  • Scanner(File source, String charsetName) throws FileNotFoundException

  • Scanner(File source, Charset charset) throws IOException (seit Java 10)

  • Scanner(InputStream source)

  • Scanner(InputStream source, String charsetName)

  • Scanner(Readable source)

  • Scanner(ReadableByteChannel source)

  • Scanner(ReadableByteChannel source, String charsetName)

  • Scanner(ReadableByteChannel source, Charset charset) (seit Java 10)

  • Scanner(InputStream source, Charset charset) (seit Java 10)

Zeilenweises Einlesen einer Datei

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

Listing 5.12    src/main/java/com/tutego/insel/string/PrintAllLines.java, Ausschnitt

import java.io.IOException;

import java.nio.charset.StandardCharsets;

import java.nio.file.Paths;

import java.util.Scanner;



public class PrintAllLines {



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

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 der Nutzung. Der Umgang mit Exceptions und das besondere try werden beide in Kapitel 8, »Ausnahmen müssen sein«, genauer erklärt. Auch sollte immer die Kodierung angegeben werden, die in unserem Fall ISO 8859-1, also Latin-1, ist. Der Kodierungs-String, der für den Scanner-Konstruktor nötig ist, stammt von einer Konstanten 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.

[+]  Tipp

Wenden wir Scanner auf einen String an, so kann dieser String vom Scanner Zeile für Zeile zerlegt werden. Seit Java 11 bietet die String-Methode lines() eine Alternative.

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();

Wichtig: Der Scanner sollte in diesem Fall nicht geschlossen werden!

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 dieses Typs folgt.

[zB]  Beispiel

Wir betrachten die einzelnen nextXXX()- und hasNextXXX()-Methoden an einem Beispiel:

Listing 5.13    src/main/java/com/tutego/insel/string/ScannerDemo.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 – Trennzeichen 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.

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java ist auch eine Insel Java ist auch eine Insel

Jetzt Buch bestellen


 Buchempfehlungen
Zum Rheinwerk-Shop: Captain CiaoCiao erobert Java

Captain CiaoCiao erobert Java




Zum Rheinwerk-Shop: Java SE 9 Standard-Bibliothek

Java SE 9 Standard-Bibliothek




Zum Rheinwerk-Shop: Algorithmen in Java

Algorithmen in Java




Zum Rheinwerk-Shop: Objektorientierte Programmierung

Objektorientierte Programmierung




 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz

InfoInfo



 

 


Copyright © Rheinwerk Verlag GmbH 2021

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



Cookie-Einstellungen ändern