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 Exceptions
7 Äußere.innere Klassen
8 Besondere Klassen der Java SE
9 Generics<T>
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Einführung in die nebenläufige Programmierung
13 Einführung in Datenstrukturen und Algorithmen
14 Einführung in grafische Oberflächen
15 Einführung in Dateien und Datenströme
16 Einführung in die <XML>-Verarbeitung mit Java
17 Einführung ins Datenbankmanagement mit JDBC
18 Bits und Bytes und Mathematisches
19 Die Werkzeuge des JDK
A Die Klassenbibliothek
Stichwort

Download:
- Aufgaben, ca. 1,1 MB
- Programme, ca. 12,8 MB

Buch bestellen
Ihre Meinung?

Spacer
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
Galileo Computing
1308 S., 10., aktualisierte Auflage, geb., mit DVD
ca. 49,90 Euro, ISBN 978-3-8362-1802-3
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 Unicode 4.0 und Java *
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 Leerstring
Pfeil 4.4.4 Zugriff auf ein bestimmtes Zeichen mit charAt( )
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 Phonetische Vergleiche *
Pfeil 4.4.9 String-Teile extrahieren
Pfeil 4.4.10 Strings anhängen, Groß-/Kleinschreibung und Leerraum
Pfeil 4.4.11 Suchen und ersetzen
Pfeil 4.4.12 String-Objekte mit Konstruktoren neu anlegen *
Pfeil 4.5 Konvertieren zwischen Primitiven und Strings
Pfeil 4.5.1 Unterschiedliche Typen in String-Repräsentationen konvertieren
Pfeil 4.5.2 Stringinhalt in einen primitiven Wert konvertieren
Pfeil 4.5.3 String-Repräsentation im Format Binär, Hex, Oktal *
Pfeil 4.6 Veränderbare Zeichenketten mit StringBuilder und StringBuffer
Pfeil 4.6.1 Anlegen von StringBuilder/StringBuffer-Objekten
Pfeil 4.6.2 StringBuilder/StringBuffer in andere Zeichenkettenformate konvertieren
Pfeil 4.6.3 Zeichen(folgen) erfragen
Pfeil 4.6.4 Daten anhängen
Pfeil 4.6.5 Zeichen(folgen) setzen, löschen und umdrehen
Pfeil 4.6.6 Länge und Kapazität eines StringBuilder/StringBuffer-Objekts *
Pfeil 4.6.7 Vergleichen von String mit StringBuilder und StringBuffer
Pfeil 4.6.8 hashCode() bei StringBuilder/StringBuffer *
Pfeil 4.7 CharSequence als Basistyp *
Pfeil 4.8 Reguläre Ausdrücke
Pfeil 4.8.1 Pattern.matches() bzw. String#matches()
Pfeil 4.8.2 Die Klassen Pattern und Matcher
Pfeil 4.8.3 Finden und nicht matchen
Pfeil 4.8.4 Gierige und nicht gierige Operatoren *
Pfeil 4.8.5 Mit MatchResult alle Ergebnisse einsammeln *
Pfeil 4.8.6 Suchen und Ersetzen mit Mustern
Pfeil 4.8.7 Hangman Version 2
Pfeil 4.9 Zerlegen von Zeichenketten
Pfeil 4.9.1 Splitten von Zeichenketten mit split()
Pfeil 4.9.2 Die Klasse Scanner
Pfeil 4.9.3 Die Klasse StringTokenizer *
Pfeil 4.9.4 BreakIterator als Zeichen-, Wort-, Zeilen- und Satztrenner *
Pfeil 4.10 Zeichenkodierungen, XML/HTML-Entitys, Base64 *
Pfeil 4.10.1 Unicode und 8-Bit-Abbildungen
Pfeil 4.10.2 Das Paket java.nio.charset und der Typ Charset
Pfeil 4.10.3 Konvertieren mit OutputStreamWriter/InputStreamReader-Klassen *
Pfeil 4.10.4 XML/HTML-Entitys ausmaskieren
Pfeil 4.10.5 Base64-Kodierung
Pfeil 4.11 Ausgaben formatieren
Pfeil 4.11.1 Formatieren und Ausgeben mit format()
Pfeil 4.11.2 Die Formatter-Klasse *
Pfeil 4.11.3 Formatieren mit Masken *
Pfeil 4.11.4 Format-Klassen
Pfeil 4.11.5 Zahlen, Prozente und Währungen mit NumberFormat und DecimalFormat formatieren *
Pfeil 4.11.6 MessageFormat und Pluralbildung mit ChoiceFormat
Pfeil 4.12 Sprachabhängiges Vergleichen und Normalisierung *
Pfeil 4.12.1 Die Klasse Collator
Pfeil 4.12.2 Effiziente interne Speicherung für die Sortierung
Pfeil 4.12.3 Normalisierung
Pfeil 4.13 Zum Weiterlesen

Rheinwerk Computing - Zum Seitenanfang

4.12 Sprachabhängiges Vergleichen und Normalisierung *Zur nächsten Überschrift

Für die deutsche Sprache gilt, dass »ä« zwischen »a« und »b« äquivalent zu »ae« einsortiert wird und nicht so, wie Unicode das Zeichen einordnet: hinter dem »z«. Ähnliches gilt für das »ß«. Auch das Spanische hat seine Besonderheiten im Alphabet: Hier gelten das »ch« und das »ll« als einzelner Buchstabe, die passend einsortiert werden müssen.

Damit Java für alle Landessprachen die String-Vergleiche korrekt durchführen kann, bietet die Bibliothek Collator-Klassen.


Rheinwerk Computing - Zum Seitenanfang

4.12.1 Die Klasse CollatorZur nächsten ÜberschriftZur vorigen Überschrift

Mit den java.text.Collator-Objekten ist es möglich, Zeichenketten nach jeweils landesüblichen Kriterien zu vergleichen. So werden die Sprachbesonderheiten jedes Landes beachtet. Ein Collator-Objekt wird vor seiner Benutzung mit getInstance() erzeugt.

Beispiel

Das »Ä« liegt zwischen »A« und »B«:

Listing 4.32: CollatorDemo.java

Collator col = Collator.getInstance();
System.out.println( col.compare( "Armleuchter", "Ätsch" ) ); // –1
System.out.println( col.compare( "Ätsch", "Bätsch" ) ); // –1

Die statische Fabrikmethode getInstance() nimmt optional einen Ländercode als Locale-Objekt an. Explizit setzt getInstance(Locale.GERMAN) das Vergleichsverfahren für deutsche Zeichenketten; die Länderbezeichnung ist in diesem Fall eine Konstante der Locale-Klasse. Standardmäßig nutzt getInstance() die aktuelle Einstellung des Systems.

Abbildung

Abbildung 4.12: UML-Diagramm von Collator und Obertypen

abstract class java.text.Collator
implements Comparator<Object>, Cloneable
  • static Collator getInstance()
    Liefert einen Collator für die aktuelle Landessprache.
  • static Collator getInstance(Locale desiredLocale)
    Liefert einen Collator für die gewünschte Sprache.
  • abstract int compare(String source, String target)
    Vergleicht die beiden Zeichenketten auf ihre Ordnung. Der Rückgabewert ist entweder <0, 0 oder >0.
  • int compare(Object o1, Object o2)
    Vergleicht die beiden Argumente auf ihre Ordnung. Ruft compare((String)o1, (String)o2) auf.

Vergleichsarten

Die Collator-Klasse deklariert sinnvolle Methoden, die über die Vergleichsmöglichkeiten der String- und StringBuffer/StringBuilder-Klasse hinausgehen. So ist es über die Methode setStrength() möglich, unterschiedliche Vergleichsarten einzustellen. Die Collator-Klasse deklariert vier Strenge-Konstanten:

  • PRIMARY: Erkennt Unterschiede im Grundzeichen, sodass »a« kleiner »b« ist. Es gibt keine Unterschiede durch Akzente und Umlaute, sodass »a«, »ä« und »á« gleich sind.
  • SECONDARY: Erkennt Zeichen mit Akzenten. So sind »a« und »á« nicht mehr gleich wie bei PRIMARY.
  • TERTIARY: Unterscheidet in der Groß- und Kleinschreibung; bei PRIMARY und SECONDARY ist die Schreibweise egal, und »a« ist gleich »A«.
  • IDENTICAL: Wirklich alle Unicode-Zeichen sind anders. Während die ersten drei Konstanten nicht sichtbare Buchstaben wie '\u0001' oder '\u0006' gleich behandeln, sind sie unter IDENTICAL wirklich unterschiedlich.

Was die einzelnen Werte für jede Sprache bedeuten, beschreibt der Unicode-Standard präzise. Beispielsweise erkennt der tolerante Vergleich »abc« und »ABC« als gleich. Ohne explizit gesetztes setStrength() ist der Standard TERTIARY:

Listing 4.33: CollatorStrengthDemo.java

import java.util.*;
import java.text.*;

class CollatorStrengthDemo
{
static void compare( Collator col, String a, String b )
{
if ( col.compare( a, b ) < 0 )
System.out.println( a + " < " + b );

if ( col.compare( a, b ) == 0 )
System.out.println( a + " = " + b );

if ( col.compare( a, b ) > 0 )
System.out.println( a + " > " + b );
}

public static void main( String[] args )
{
Collator col = Collator.getInstance( Locale.GERMAN );

System.out.println( "Strength = PRIMARY" );
col.setStrength( Collator.PRIMARY );
compare( col, "abc", "ABC" );
compare( col, "Quäken", "Quaken" );
compare( col, "boß", "boss" );
compare( col, "boß", "boxen" );

System.out.printf( "%nStrength = SECONDARY%n" );
col.setStrength( Collator.SECONDARY );
compare( col, "abc", "ABC" );
compare( col, "Quäken", "Quaken" );
compare( col, "boß", "boss" );
compare( col, "boß", "boxen" );

System.out.printf( "%nStrength = TERTIARY%n" );
col.setStrength( Collator.TERTIARY );
compare( col, "abc", "ABC" );
compare( col, "Quäken", "Quaken" );
compare( col, "boß", "boss" );
compare( col, "boß", "boxen" );
}
}

Die Ausgabe ist folgende:

Strength = PRIMARY
abc = ABC
Quäken = Quaken
boß = boss
boß < boxen
Strength = SECONDARY
abc = ABC
Quäken > Quaken
boß = boss
boß < boxen
Strength = TERTIARY
abc < ABC
Quäken > Quaken
boß > boss
boß < boxen

Rheinwerk Computing - Zum Seitenanfang

4.12.2 Effiziente interne Speicherung für die SortierungZur nächsten ÜberschriftZur vorigen Überschrift

Obwohl sich mit der Collator-Klasse sprachspezifische Vergleiche korrekt umsetzen lassen, ist die Geschwindigkeit gegenüber einem normalen String-Vergleich geringer. Daher bietet die Collator-Klasse die Objektmethode getCollationKey() an, die ein CollationKey-Objekt liefert, das schnellere Vergleiche zulässt.

Collator col = Collator.getInstance( Locale.GERMAN );
CollationKey key1 = col.getCollationKey( "ätzend" );
CollationKey key2 = col.getCollationKey( "Bremsspur" );

Durch CollationKeys lässt sich die Performance bei Vergleichen zusätzlich verbessern, da der landesspezifische String in einen dazu passenden, normalen Java-String umgewandelt wird, der dann schneller gemäß der internen Unicode-Zeichenkodierung verglichen werden kann. Dies bietet sich zum Beispiel beim Sortieren einer Tabelle an, wo mehrere Vergleiche mit einem gleichen String durchgeführt werden müssen. Der Vergleich wird mit compareTo(CollationKey) durchgeführt.

Beispiel

Der Vergleich von key1 und key2 lässt sich durch folgende Zeile ausdrücken:

int comp = key2.compareTo( key1 );
Das Ergebnis ist wie bei der compare()-Methode bei Collator-Objekten entweder <0, 0 oder >0.

final class java.text.CollationKey
implements Comparable<CollationKey>
  • int compareTo(CollationKey target)
    Vergleicht zwei CollationKey-Objekte miteinander.
  • int compareTo(Object o)
    Vergleicht den aktuellen CollationKey mit dem angegebenen Objekt. Ruft lediglich compareTo((CollationKey)o) auf.
  • byte[] toByteArray()
    Konvertiert den CollationKey in eine Folge von Bytes.
  • boolean equals(Object target)
    Testet die beiden CollationKey-Objekte auf Gleichheit.
  • String getSourceString()
    Liefert den String zum CollationKey.
  • int hashCode()
    Berechnet den Hashcode für den CollationKey.
abstract class java.text.Collator
implements Comparator<Object>, Cloneable
  • abstract CollationKey getCollationKey(String source)
    Liefert einen CollationKey für den konkreten String.
Hinweis

Das java.text-Paket hat weitere sehr interessante Schnittstellen. IBM stellt unter http://www.ibm.com/developerworks/java/library/j-text-searching.html weitere Typen, wie zum Beispiel RuleBasedCollator und CollationElementIterator, für das Suchen vor.


Rheinwerk Computing - Zum Seitenanfang

4.12.3 NormalisierungZur vorigen Überschrift

Seit Java 6[128](Die Klasse gab es schon lange vorher, doch war sie in einem Sun-Paket »versteckt«.) gibt es die Klasse java.text.Normalizer, die eine Unicode-Normalisierung (http://unicode.org/faq/normalization.html) ermöglicht. Die Klasse bietet zwei einfache statische Methoden:

  • boolean isNormalized(CharSequence src, Normalizer.Form form)
  • String normalize(CharSequence src, Normalizer.Form form)

Der Normalizer normalisiert oder testet nach den Vorgaben des Unicode-Standards (http://www.unicode.org/unicode/reports/tr15/) einen String nach den Normalisierungsformaten NFC, NFD, NFKC und NFKD.

Beispiel

Normalisiere einen String:

String s = Normalizer.normalize( "aäüöñ", Normalizer.Form.NFKD );
System.out.println( s ); // aa?u?o?n?
System.out.println( Arrays.toString( s.getBytes() ) );
// [97, 97, 63, 117, 63, 111, 63, 110, 63]

Die übrig gebliebenen Striche und Punkte lassen sich einfach entfernen, denn so ist das Ergebnis nicht sonderlich nützlich.

Beispiel

Ersetze in einem String alle diakritischen Zeichen:

String s = "Müller";
s = Normalizer.normalize( s, Normalizer.Form.NFD );
s = s.replaceAll( "[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+", "" );
System.out.println( s ); // Muller
Die Lösung geht zweistufig vor. Der Normalisierer zerlegt zunächst den String und macht die eigentliche Arbeit. replaceAll() entfernt dann übrig gebliebene Punkte, Striche, Kreise und Häkchen.



Ihr Kommentar

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

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Java ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Java SE Bibliotheken






 Java SE Bibliotheken


Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Einstieg in Eclipse






 Einstieg in
 Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in
 Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2011
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