Das sind die schönen Fehler die trotz intensiver Tests einfach nicht auffallen wollen. Wie sortiert man in Java richtig? Richtig heißt, dass auch deutsche Umlaute berücksichtigt werden?

Für unsere Beispiele nehmen wir die compareTo-Methode der Klasse String, die zwei Zeichenketten auf ihre Gleichheit hin überprüft.

Beispiele

"foo".compareTo("bar") Liefert korrekterweise eine Zahl größer 0, denn ein f ist größer als ein b.

"foo".compareTo("bär") Liefert ebenfalls eine Zahl größer als 0. Da das f bereits größer als das b ist, werden die anderen Buchstaben nicht beachtet.

"boo".compareTo("bär") Jetzt wird es interessant. Der Vergleich liefert eine negative Zahl, um genau zu sein eine -117. Doch warum?

Die compareTo-Methode ist so aufgebaut, dass sie so lange Buchstabe für Buchstabe durchgeht, bis sie einen Unterschied feststellt. Da die ersten Buchstaben identisch sind, wird o mit ä überprüft. Und ä ist scheinbar größer als o. In der deutschen Sprache ist das falsch, aber im Unicode-Zeichensatz ist dies korrekt.

Erklärung

Wie kurz angedeutet, basiert der Vergleich auf dem Unicode-Zeichensatz. Wenn wir uns eine entsprechende Unicode-Tabelle anschauen stellen wir fest, während sich z.B. das o bei Hexdezimal 6F (0060+0F) - was Dezimal 111 entspricht - befindet, finden wir das ä erst bei E4 (Dezimal 228).

Und einigen wird es sicherlich direkt ins Auge gesprungen sein: 111 minus 228 entspricht unserer -117!

Sortierung mit Umlauten

Schön und gut. Und wie kann ich nun Umlaute vergleichen? Vergleichen lassen sich Zeichenketten in Java in dem man dem System vorher mitteilt, dass man auf deutsch sortieren möchte. Dafür gibt es mehrere Ansätze. Einen Ansatz auf den ich hier näher eingehen möchte, basiert auf der Klasse Collator.

Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.SECONDARY);// a == A, a < Ä
collator.compare("boo", "bär");

Zuerst wird eine Instanz der Klasse Collator mit einer deutschen Locale erzeugt. Durch den zweiten Aufruf wird dem Collator mitgeteilt, dass a == A und a < Ä gelten soll. Der anschließende Aufruf der compare-Methode liefert nun korrekterweise eine Zahl größer als 0. "boo" ist somit größer als "bär".

blogroll
tags