Mit ‘Collator’ getaggte Artikel

Stringvergleiche mit Collator

Freitag, 06. März 2009

Für sprachabhängige Vergleiche von Zeichenketten bietet Java die Klasse Collator. Meist ist das Ergebnis eines Collator-Vergleichs intuitiv und sofort nachvollziehbar. Es gibt aber Fälle, wo man schon mal ins Grübeln kommt.
Das Ergebnis eines Vergleichs zweier Zeichenketten a und b kann -1. 0, 1 sein und bedeutet, dass a kleiner als, gleich, größer als b ist. Völlig klar sind folgende Beispiele:

Collator collator = Collator.getInstance();
coll.compare("abc", "xyz"); //= 1
coll.compare("bcd", "bdd"); //= 1
coll.compare("123", "xyz"); //= -1, da Buchstaben > Zahlen

Einiges Grübeln verursachten die folgenden Vergleiche:

Collator collator = Collator.getInstance();
coll.compare("5_", "-9")); // (1)
coll.compare("5_", "-0")); // (2)

Anzunehmen ist, dass beide dasselbe zurückliefern – dies ist aber nicht der Fall. Der Vergleich (1) resultiert in -1 und (2) in 1.
Bei einem Blick hinter die Kulissen zeigte sich, dass der java.text.RuleBasedCollator zum Einsatz kommt. Dieser arbeitet, wie der Name andeutet, mit regelbasierten Vergleichen.
Die deutschen und z.B. auch englischen Regeln betrachten das Zeichen ‘-’ als ein ignorierbares Zeichen. Daraus folgt, dass letztendlich nur noch 5 mit 9 bzw. 0 verglichen wird.

Wenn also ein Vergleich ein unerwartetes Ergebnis zu Tage fördert, liegt es vielleicht an einer nicht so intuitiv nachvollziehbaren Regel.

Genauere Informationen gibt es in den Javadocs des RuleBasedCollators

Andreas Siepert


Andreas Siepert