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
7
A
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ęść]
Powiązane problemy
- 1. Android Sqlite Specjalne znaki
- 2. Pozostawić tylko niektóre litery, znaki specjalne ban ($% itd) oprócz innych (”-)
- 3. Jak wyświetlać znaki specjalne w systemie Android?
- 4. Chcę porównać dwa projekty w studiu Android
- 5. Sprawdź znaki specjalne (/ * - + _ @ i $ #%) w ciągu znaków?
- 6. PHP: Konwertuj wielkie litery na wielkie litery na małe litery
- 7. Wielkie litery mvc Model vs małe litery
- 8. Małe litery Web API Małe litery
- 9. jak zmienić wielkość litery pierwszej litery?
- 10. znaki specjalne (@,?) Jako XML-string w Android App
- 11. MySQL Wstaw specjalne znaki
- 12. znaki specjalne w sed
- 13. Java zastępuje znaki specjalne
- 14. znaki specjalne zastąpić
- 15. wget i znaki specjalne
- 16. Regex usuń znaki specjalne
- 17. kod Pythona, aby porównać obrazy w python
- 18. Jak porównać datę systemu z mydate w systemie Android 2.1?
- 19. Znaki specjalne w Androidzie sms
- 20. Pojedyncze wyrażenie regularne, które zmienia wielkość litery na małe litery na małe litery
- 21. Sprawdź, czy ciąg mają wielkie litery, małe litery i numer
- 22. Jak przekonwertować wielkie litery na małe litery w Notatniku ++
- 23. Sortuj ciągi znaków, najpierw pierwsze litery, potem litery wewnątrz słów
- 24. python 2.7 małe litery
- 25. Cięcie łańcucha na litery
- 26. jQuery.attr() gwarantuje małe litery?
- 27. document.referrer dostarcza akcentowane litery
- 28. Nazwa dyrektywy kątowej: dozwolone są tylko małe litery?
- 29. filtry garbling Maven znaki specjalne
- 30. Nadrzędne specjalne metody na instancji
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
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
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