Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 4 Der Umgang mit Zeichenketten
gp 4.1 Strings und deren Anwendung
gp 4.1.1 String-Objekte für konstante Zeichenketten
gp 4.1.2 String-Länge
gp 4.1.3 Gut, dass wir verglichen haben
gp 4.1.4 String-Teile extrahieren
gp 4.1.5 Suchen und Ersetzen
gp 4.1.6 Veränderte Strings liefern
gp 4.1.7 Typen in Zeichenketten konvertieren
gp 4.2 Veränderbare Zeichenketten mit der Klasse StringBuffer
gp 4.2.1 Anlegen von StringBuffer-Objekten
gp 4.2.2 Die Länge eines StringBuffer-Objekts lesen und setzen
gp 4.2.3 Daten anhängen
gp 4.2.4 Zeichen(folgen) setzen, erfragen, löschen und umdrehen
gp 4.3 Vergleiche von Zeichenketten
gp 4.3.1 equals() in String und StringBuffer
gp 4.3.2 Sollte es ein equals() und hash() bei StringBuffer geben?
gp 4.3.3 Sprachabhängiges Vergleichen mit der Collator-Klasse
gp 4.3.4 Effiziente interne Speicherung für die Sortierung
gp 4.4 Zeichenkodierungen umwandeln
gp 4.5 Die Klasse StringTokenizer
gp 4.6 Der BreakIterator als Wort- und Satztrenner
gp 4.7 Formatieren mit Format-Objekten
gp 4.7.1 Prozente, Zahlen und Währungen ausgeben
gp 4.7.2 Ausgaben formatieren
gp 4.7.3 Dezimalzahlformatierung
gp 4.8 Reguläre Ausdrücke
gp 4.8.1 Splitten von Zeichenketten
gp 4.8.2 split() in String
gp 4.8.3 Das alternative Paket org.apache.regexp


Galileo Computing

4.5 Die Klasse StringTokenizertoptop

Die Klasse StringTokenizer hilft uns, eine Zeichenkette in Token zu zerlegen. Ein Token ist ein Teil eines Strings, das durch bestimmte Trennzeichen (engl. delimiter) von anderen Token getrennt wird. Nehmen wir als Beispiel den Satz »Moderne Musik ist Instrumentespielen nach Noten« (Peter Sellers). Wählen wir Leerzeichen als Trennzeichen, lauten die einzelnen Token »Moderne«, »Musik« und so weiter. Der String-Tokenizer ist nicht an bestimmte Trenner gebunden, sie können vielmehr völlig frei gewählt werden. Nur in der Voreinstellung sind Tabulator, Leerzeichen und Zeilentrenner die Delimiter.


Hinweis In der Implementierung von StringTokenizer können nur einzelne Zeichen als Trenner verwendet werden. Es sind keine Zeichenfolgen wie »:=« denkbar.

Abbildung
Hier klicken, um das Bild zu Vergrößern


Beispiel Um einen String mithilfe eines StringTokenizer-Objekts zu zerlegen, wird dem Konstruktor der Klasse der zu unterteilende Text als Parameter übergeben:
StringTokenizer tokenizer;
tokenizer = new StringTokenizer( "Schweigen kann die grausamste Lüge sein." );

Sollen andere Zeichen als die voreingestellten Trenner den Satz zerlegen, kann dem Konstruktor als zweiter String eine Liste von Trennern übergeben werden. Jedes Zeichen, das in diesem String vorkommt, fungiert als einzelnes Trennzeichen:

StringTokenizer st;
st = new StringTokenizer( "Blue=0000ff\nGreen:00ff00\n", "=:\n" );

Um den Text abzulaufen, gibt es die Methoden nextToken() und hasMoreTokens().1 Die Methode nextToken() liefert das nächste Token im String. Ist kein Token mehr vorhanden, wird eine NoSuchElementException ausgelöst. Damit wir frei von diesen Überraschungen sind, können wir mit der Methode hasMoreTokens() nachfragen, ob noch weitere Token vorliegen.


Beispiel Das folgende Stück Programmtext zeigt die leichte Benutzung der Klasse:
String s = "Faulheit ist der Hang zur Ruhe ohne vorhergehende Arbeit";
StringTokenizer tokenizer = new StringTokenizer( s );
while ( tokenizer.hasMoreTokens() )
  System.out.println( tokenizer.nextToken() );

Neben den beiden Konstruktoren existiert noch ein Dritter, der auch die Trennzeichen als eigenständige Bestandteile bei nextToken() übermittelt.

Abbildung
Hier klicken, um das Bild zu Vergrößern


class java.util.StringTokenizer
implements Enumeration

gp StringTokenizer( String str, String delim, boolean returnTokens )
Ein String-Tokenizer für str, wobei jedes Zeichen in delim als Trennzeichen gilt. Ist returnTokens gleich true, so werden die Trennzeichen beim Aufzählen mit zurückgegeben.
gp StringTokenizer( String str, String delim )
Ein String-Tokenizer für str, wobei alle Zeichen in delim als Trennzeichen gelten. Entspricht dem Aufruf von this(str, delim, false);
gp StringTokenizer( String str )
Ein String-Tokenizer für str. Entspricht dem Aufruf von
gp this(str, " \t\n\r\f", false); Die Trennzeichen sind Leerzeichen, Tabulator, Zeilenende und Seitenvorschub.
gp boolean hasMoreTokens()
Testet, ob weitere Token verfügbar sind.
gp String nextToken()
Liefert das nächste Token vom String-Tokenizer.
gp String nextToken( String delim )
Die Delimiter-Zeichen werden erst neu gesetzt, und anschließend wird das nächste Token geholt.
gp boolean hasMoreElements()
Ist gleich dem Aufruf von hasMoreTokens(). Existiert nur, damit das Objekt als Enumeration benutzt werden kann.
gp Object nextElement()
Ist gleich dem Aufruf von nextToken(). Existiert nur, damit das Objekt als Enumeration benutzt werden kann. Der weniger spezifische Ergebnistyp Object macht eine Typumwandlung erforderlich.
gp int countTokens()
Zählt die Anzahl der noch möglichen nextToken()-Methodenaufrufe. Die aktuelle Position wird dadurch nicht berührt. Der Aufruf der Funktion ist nicht billig.
gp nextToken() und nextElement() können eine NoSuchElementException auslösen.

Beispiel Die countTokens()-Funktion ist hilfreich beim Aufbauen eines Felds, welches Ergebnisse des Parsens aufnehmen soll. Nehmen wir an, wir haben eine Variable ints vom Typ String mit dem Inhalt »0, 1,4,6,13«. (Die Zahlen ergeben die Folge der fleißigen Biber-Funktion.9) Für die Zeichenfolge soll ein Ganzzahl-Feld aufgebaut werden, sodass jedes Zahl auf das Feld abgebildet wird. Der Trenner ist ein Komma, doch auch Leerzeichen und Tabulator sollten Trenner sein.
StringTokenizer tokenizer = new StringTokenizer( ints, ", \t" );
int numbers[] = new int[tokenizer.countTokens()];
    
for ( int i = 0; tokenizer.hasMoreTokens(); ++i )
  numbers[i] = Integer.parseInt( tokenizer.nextToken() );
}






1 Die Methode hasMoreElemente() ruft direkt hasMoreTokens() auf und wurde nur implementiert, da ein StringTokenizer die Schnittstelle Enumeration implementiert.





Copyright (c) Galileo Press GmbH 2004
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.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de