4.6 Sprachabhängiges Vergleichen mit der Collator-Klasse
 
Mit der Collator-Klasse ist es möglich, Zeichenketten nach jeweils landesüblichen Kriterien zu vergleichen. So werden die Sprachbesonderheiten jedes Landes beachtet.
Beispiel Für die deutsche Sprache gilt, dass »ä« zwischen »a« und »b« äquivalent zu »ae« einsortiert wird und nicht so, wie der ASCII-Zeichensatz das Zeichen einordnet, hinter dem »z«. Ähnliches gilt für das »ß«. Auch das Spanische hat seine Besonderheiten im Alphabet. Hier gilt das »ch« und das »ll« als einzelner Buchstabe.
|
Ein Collator-Objekt wird vor seiner Benutzung mit getInstance() erzeugt. Dieser Funktion kann auch ein Argument übergeben werden, mit dem der jeweils gewünschte Ländercode ausgewählt werden kann: getInstance(Locale.GERMAN) ermöglicht richtiges Vergleichen für deutsche Zeichenketten. Die Länderbezeichnungen sind Konstanten aus der Locale-Klasse.
abstract class java.text.Collator
implements Comparator, 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. |
Listing 4.3
CollatorDemo.java
import java.util.*;
import java.text.*;
class CollatorDemo
{
public static void comp( 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 );
comp( col, "abc", "ABC" );
comp( col, "Quäken", "Quaken" );
comp( col, "boß", "boss" );
comp( col, "boß", "boxen" );
System.out.println( "\nStrength = SECONDARY" );
col.setStrength( Collator.SECONDARY );
comp( col, "abc", "ABC" );
comp( col, "Quäken", "Quaken" );
comp( col, "boß", "boss" );
comp( col, "boß", "boxen" );
System.out.println( "\nStrength = TERTIARY" );
col.setStrength( Collator.TERTIARY );
comp( col, "abc", "ABC" );
comp( col, "Quäken", "Quaken" );
comp( col, "boß", "boss" );
comp( col, "boß", "boxen" );
}
}
Die Ausgabe1
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
Die Collator-Klasse besitzt viele sinnvolle Methoden, die über die Vergleichsfunktionalität der String- und StringBuffer-Klasse hinausgehen. So ist es über die Funktion setStrength() möglich, die Toleranz bei Vergleichen einzustellen. Beispielsweise erkennt der tolerante Vergleich »abc« und »ABC« als gleich.
4.6.1 Effiziente interne Speicherung für die Sortierung
 
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 dem 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.
|
class java.text.CollationKey
implements Comparable
|
|
int compareTo( CollationKey target )
Vergleicht zwei CollationKey-Objekte miteinander. |
|
int compareTo( Object o )
Vergleicht den aktuellen CollationKey mit dem angegebenen Objekt.
Ruft compareTo ((CollationKey)o) auf. |
|
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. |
|
byte[] toByteArray()
Konvertiert den CollationKey in eine Folge von Bytes. |
abstract class java.text.Collator
implements Comparator, Cloneable
|
|
abstract CollationKey getCollationKey( String source )
Liefert einen CollationKey für den konkreten String. |
1
Erstaunlicherweise ergibt sich unter einigen Linux-Versionen ein etwas anderes Bild, denn die Sortierreihenfolge ist dort durch einen Bug falsch.
|