12.1.6 Collator (Vergleichen von Zeichenketten)
12.1.6 Collator (Vergleichen von Zeichenketten)Der Vergleich von Zeichenketten hängt oft von der lexikographischen Ordnung ab. Die lexikographische Ordnung selbst hängt wieder von der Region ab. Java bietet hierfür die Klasse Collator (Collation engl. : Der Textvergleich) an, die Zeichenketten nach bestimmten Kriterien sortieren kann. Die Methode compare() erlaubt das Vergleichen zweier Zeichenketten.
Zur Bestimmung der Sortierreihenfolge wird die Klasse java.util.Locale benötigt, die die entsprechende Region und deren Sprache bestimmt.
Das Vorgehen zum Konfigurieren und Vergleichen von Zeichenketten ist das folgende:
- Auswahl der gewünschten Region und Sprache (Locale). Z.Bsp. Locale.GERMANY
- Bestimmung der gewünschten Sortierstärke für den Collator ( setStrength() )
- Collator.PRIMARY : nur die grundlegende Abfolge wie z.Bsp 'a' und 'b' werden berücksichtigt
- Collator.SECONDARY: Unterschiede wie z.Bsp. 'a' und 'ä' werden berücksichtigt falls nach den Regeln der Kategorie "Primary" kein Unterschied existiert.
- Collator.TERTIARY: Unterschiede wie z. Bsp. 'a' und 'A' werden berücksichtigt falls nach den Regeln der Kategorie "Secondary" kein Unterschied existiert
- Vergleichen der Zeichenketten mit compare() oder equals()
Beispiel
Vergleichen von Vor- und Nachnamen einer Person nach deutschen Sortierregeln inklusive besonderer deutscher Zeichen mit der Methode compare() der Klasse Collator.
package s2.sort; import java.text.Collator; import java.util.Locale; public class Person{ private String nachname; private String vorname; private static Locale myLocale = Locale.GERMANY; public boolean istKleinerAls(Person p) { boolean kleiner = false; Collator myCollator = Collator.getInstance(myLocale); // Beim Vergleich auch Gross- und Kleinschreibung unterscheiden myCollator.setStrength(Collator.TERTIARY); // Konfiguriere die Sortierordnung if (myCollator.compare(nachname, p.nachname) < 0) { kleiner = true; } else if (myCollator.compare(nachname, p.nachname) == 0) { kleiner = myCollator.compare(vorname, p.vorname) < 0; } return kleiner; } }
Lauffähiges Programm zum Testen von Locales und Sortierordnungen
Das Programm Lexikographisch akzeptiert die folgende Kommandozeilensyntax:
java s2.sort.Lexikographisch String1 String2 [[German|French|UK|US] [PRIMARY|SECONDARY|TERTIARY]]
Beispiele
Quellcode
package Kurs2.Sort; import java.text.Collator; import java.util.Locale; /** * * @author sschneid */ public class Lexikographisch { public static void main(String[] args) { String s1 = "Test1"; String s2 = "Test2"; Locale myLocale = Locale.GERMANY; int strength = Collator.TERTIARY; if (args.length < 2) { System.out.println("Erforderliche Mindestparameter: String1 String2");
} else { s1 = args[0]; s2 = args[1]; } if (args.length >= 3) { String loc = args[2]; if (loc.equalsIgnoreCase("German") || loc.equalsIgnoreCase("Germany")) { myLocale = Locale.GERMAN; } if (loc.equalsIgnoreCase("France") || loc.equalsIgnoreCase("French")) { myLocale = Locale.FRENCH; } if (loc.equalsIgnoreCase("US")) { myLocale = Locale.US; } if (loc.equalsIgnoreCase("UK") || loc.equalsIgnoreCase("English")) { myLocale = Locale.UK; } // Add more locales here... } if (args.length >= 4) { String s = args[3]; if (s.equalsIgnoreCase("PRIMARY")) { strength = Collator.PRIMARY; } if (s.equalsIgnoreCase("SECONDARY")) { strength = Collator.SECONDARY; } if (s.equalsIgnoreCase("TERTIARY")) { strength = Collator.TERTIARY; } } vergleich(s1, s2, myLocale, strength); } private static void vergleich(String s1, String s2, Locale myLocale, int strength) { Collator myCollator = Collator.getInstance(myLocale); // Beim Vergleich auch Gross- und Kleinschreibung unterscheiden // Konfiguriere die Sortierordnung myCollator.setStrength(strength); if (myCollator.compare(s1, s2) == 0) { System.out.println(s1 + " ist gleich " + s2); } if (myCollator.compare(s1, s2) < 0) { System.out.println(s1 + " vor " + s2); } if (myCollator.compare(s1, s2) > 0) { System.out.println(s2 + " vor " + s1); } } }
- 9391 views