Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Java ist auch eine Insel (2. Aufl.) von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 1.4
Java ist auch eine Insel (2. Auflage)
gp Kapitel 4 Der Umgang mit Zeichenketten
  gp 4.1 Strings und deren Anwendung
  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 als String und StringBuffer
    gp 4.3.1 Sollte es ein equals() und hash() bei StringBuffer geben?
  gp 4.4 Ein paar kleine Helfer
    gp 4.4.1 Strings einer gegebenen Länge erzeugen und rechtsbündig ausgeben
    gp 4.4.2 Teile im String ersetzen
  gp 4.5 Zeichenkodierungen umwandeln
  gp 4.6 Sprachabhängiges Vergleichen mit der Collator-Klasse
    gp 4.6.1 Effiziente interne Speicherung für die Sortierung
  gp 4.7 Die Klasse StringTokenizer
  gp 4.8 StreamTokenizer
  gp 4.9 Formatieren mit Format-Objekten
    gp 4.9.1 Prozente, Zahlen und Währungen ausgeben
    gp 4.9.2 Ausgaben formatieren
    gp 4.9.3 Dezimalzahlformatierung
  gp 4.10 Reguläre Ausdrücke
    gp 4.10.1 Splitten von Zeichenketten
    gp 4.10.2 split() in String
    gp 4.10.3 Das Paket gnu.regexp
  gp 4.11 Überprüfung der E-Mail-Adressen und Kreditkarteninformationen
    gp 4.11.1 Gültige E-Mail-Adressen
    gp 4.11.2 Kreditkartennummern testen


Galileo Computing

4.4 Ein paar kleine Helfer  downtop


Galileo Computing

4.4.1 Strings einer gegebenen Länge erzeugen und rechtsbündig ausgeben  downtop

An einigen Stellen in den Bibliotheken gibt es noch Nachholbedarf. Zum Beispiel an einer Funktion, die eine Zeichenkette einer vorgegebenen Länge aus einem einzelnen Zeichnen erzeugt. Selbst in einfachsten Basic-Dialekten gibt es solche Funktionen. In Java müssen wir diese jedoch selbst entwickeln.

Zuerst ist zu fragen, ob die Zeichenkette als String oder als StringBuffer bereitgestellt werden soll? In der Regel wird dies ein String sein. Auch ohne Bibliotheksfunktionen lässt sich mit dem Plus-Operator eine Zeichenkette in einer Schleife zusammensetzen. Das ist sicherlich die erste Idee:

String s = "";

for ( int i = 0; i < len; i++ )
  s += c;

Hier ist len die Länge des Ergebnis-Strings und c das Zeichen.

In einer kritischen Geschwindigkeitsbetrachtung fällt das dauernde Erzeugen von temporären StringBuffer-Objekten auf. Die Lösung ist langsam. Anders könnten wir dies lösen, indem wir ein char-Feld der passenden Größe erzeugen, dies mit den Zeichen füllen und anschließend einmalig in einen String konvertieren. An Stelle des Zeichenfelds könnten wir auch gleich einen StringBuffer wählen.

Falls wir immer ein fixes Zeichen verwenden und die String-Länge in einem festen Bereich bleibt, so ist eine andere Möglichkeit noch viel eleganter (aber nicht unbedingt schneller). Sie arbeitet mit der substring()-Methode. Wir schneiden aus einem großen String mit festen Zeichen einfach einen String mit der benötigten Länge heraus. Damit lässt sich auch flott eine Zeile formulieren, die einen Text mit so vielen Leerzeichen füllt, dass dieser rechtsbündig ist:

text = "                  ".substring( text.length() );

Die Anzahl der Zeichen muss natürlich mit der Zeichenkettenlänge harmonisieren.


Galileo Computing

4.4.2 Teile im String ersetzen  toptop

Die Klassenbibliothek stellt dafür keine Funktionen bereit. Daher müssen wir uns diese Methode selbst implementieren. Nachfolgendes Programm ersetzt in einem String s alle auftretenden Strings search durch replace.

Listing 4.1   SubstituteDemo.java

class SubstituteDemo
{
  public static String substr( String s, String search, String replace )
  {
     StringBuffer s2 = new StringBuffer();
     int i = 0, j = 0;
     int len = search.length();

     while ( j > -1 )
     {
         j = s.indexOf( search, i );

         if ( j > -1 )
         {
           s2.append( s.substring(i,j) );
           s2.append( replace );
           i = j + len;
         }
     }
     s2.append( s.substring(i, s.length()) );

     return s2.toString();
  }

  public static void main( String args[] )
  {
   System.out.println(
   substr( "Die Deutschen gucken im Schnitt täglich 201"
             + " Minuten in die Röhre",
   "i",
   "ia" ) );
    // Quelle: GfK
  }
}

Die Klasse StringBuffer stellt die Ersetzungsoperation replace(int start, int end, String s) bereit. Über diese und indexOf() ließe sich wiederum eine ähnliche Methode substr() für StringBuffer-Objekte konstruieren.





Copyright © Galileo Press GmbH 2003
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