2012-02-21 13 views
7

Czy istnieje sposób, aby poprawnie sortować międzynarodowe ciągi w systemie Android? Używam niestandardowego komparatora i metody compareTo(), ale to mi nie wystarcza. Chcę, aby litery takie jak "ö" były wyświetlane w pobliżu "o", ale wszystkie z nich znajdują się na końcu listy. Jak mogę zmusić komparatora do myślenia, że ​​są one podobne do "o, a, etc ..."?Android porównać specjalne litery

Odpowiedz

15

Do wrażliwych na ustawienia językowe komend należy użyć Collator. Od dokumentów:

Dokonuje porównania łańcuchów z uwzględnieniem ustawień regionalnych. Konkretna podklasa, RuleBasedCollator, umożliwia dostosowanie kolejności sortowania przez korzystanie z zestawów reguł.

Przykład porównywania ciągów:

Collator deCollator = Collator.getInstance(Locale.GERMANY); // or new Locale("pl", "PL") for polish locale ;) 
System.out.println(deCollator.compare("abcö", "abco")); 

drukuje 1.


Jeśli chcesz listę ciągów wykorzystujących powyżej zbieraczki sortowania, można napisać:

final List<String> strings = Arrays.asList(
     "über", "zahlen", "können", "kreativ", "Äther", "Österreich"); 
Collections.sort(strings, deCollator); // Collator implements Comparator 
System.out.println(strings); 

drukuje:

[Äther, können, kreativ, Österreich, über, zahlen] 

EDIT: Właśnie dostrzeżone, że jesteś polskim , więc polski przykład poniżej:

final List<String> strings = Arrays.asList(
     "pięć", "piec", "Pieczka", "pięść", "pieczęć", "pieczątka"); 
Collections.sort(strings, Collator.getInstance(new Locale("pl", "PL"))); 
System.out.println(strings); 
// output: [piec, pieczątka, pieczęć, Pieczka, pięć, pięść] 
+0

Dzięki za wspaniałą odpowiedź! ;) Właściwie znalazłem jeszcze prostsze rozwiązanie: 'Collator collator = Collator.getInstance(); collator.setDecomposition (Collator.CANONICAL_DECOMPOSITION); collator.compare (jeden, dwa) 'Drugi przykład tutaj pokazuje, co robi reguła' CANONICAL_DECOMPOSITION': http://developer.android.com/reference/java/text/Collator.html – lomza

+1

Uwaga, 'Collator.getInstance () 'bez jawnego' Locale' jest zależne od środowiska: it _ Zwraca instancję Collator, która jest odpowiednia dla domyślnego ustawienia ** użytkownika **. Zobacz "[Zachowaj ostrożność względem domyślnego ustawienia narodowego] (http://developer.android.com/reference/java/util/Locale.html#default_locale)" ._ – Xaerxess

+0

Dzięki za ostrzeżenie, ale mam teraz wątpliwości. Potrzebuję posortowanych danych tylko do wyświetlenia użytkownikowi, a nie wysłania go gdzieś lub obliczenia czegoś ... Więc prawdopodobnie domyślne ustawienia regionalne są wystarczające? Ale jeśli chciałbym poprawnie posortować znaki niemieckie i duńskie i użyć ich jako wyjścia maszynowego, najlepszym wyborem byłoby użycie locale "Local.US"? – lomza

Powiązane problemy