¿Hay alguna manera de ordenar correctamente cadenas internacionales en Android? Utilizo un comparador personalizado y un método compareTo()
, pero no es suficiente para mí. Quiero que letras como esta "ö" se muestren cerca de "o", pero todas están al final de la lista. ¿Cómo puedo forzar al comparador a pensar que son similares a "o, a, etc ..."?Android compare cartas especiales
7
A
Respuesta
15
Para cadena sensible a la configuración regional comaprision use Collator
. De docs:
Realiza la comparación de cadenas sensibles a la configuración regional. Una subclase concreta, RuleBasedCollator, permite la personalización del orden de intercalación por el uso de conjuntos de reglas.
Ejemplo de cadenas que comparan:
Collator deCollator = Collator.getInstance(Locale.GERMANY); // or new Locale("pl", "PL") for polish locale ;)
System.out.println(deCollator.compare("abcö", "abco"));
grabados 1
.
Si desea lista de cadenas utilizando lo que antecede alzadora ordenar, puede escribir:
final List<String> strings = Arrays.asList(
"über", "zahlen", "können", "kreativ", "Äther", "Österreich");
Collections.sort(strings, deCollator); // Collator implements Comparator
System.out.println(strings);
impresiones:
[Äther, können, kreativ, Österreich, über, zahlen]
EDIT: sólo vio que son polaco , por lo que el ejemplo polaco a continuación:
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ęść]
Cuestiones relacionadas
- 1. Android Sqlite Caracteres especiales
- 2. SPOJ: barajamiento de cartas
- 3. Barajar cartas en C#
- 4. Cartas autoincrementadas en Perl
- 5. ¿Cómo mostrar caracteres especiales en Android?
- 6. Prueba de barajador de cartas
- 7. Mezclar una baraja de cartas
- 8. Android compare la firma del paquete actual con debug.keystore
- 9. Javascript compare 3 valores
- 10. Binary Compare DLLs
- 11. SVN branch compare
- 12. Java compare dos mapa
- 13. NSPredicate compare con Integer
- 14. DateTime Compare en C#
- 15. PHP compare el tiempo
- 16. Delphi 7 tguid compare
- 17. PHP & MySQL compare contraseña
- 18. IntelliJ IDEA compare pestañas
- 19. Compare contenedores con GoogleTest
- 20. Powershell File Compare
- 21. Compare int y unsigned int
- 22. Edición Beyond Compare 3 deshabilitada
- 23. Lucene: compare resultados entre consultas
- 24. Compare las implementaciones de JSF
- 25. caracteres especiales (@,?) Como XML-cadena en la aplicación para Android
- 26. Comparador de interfaz Java estático compare
- 27. Ant regex compare en caso de condición
- 28. Entity SQL compare datetime without miliseconds
- 29. compare dos variables en la plantilla jinja2
- 30. Compare NSDate para hoy o ayer
¡Gracias por su gran respuesta! ;) En realidad, encontré una solución aún más simple: 'Collator collator = Collator.getInstance(); collator.setDecomposition (Collator.CANONICAL_DECOMPOSITION); collator.compare (uno, dos) 'El segundo ejemplo aquí muestra lo que hace la regla' CANONICAL_DECOMPOSITION': http://developer.android.com/reference/java/text/Collator.html – lomza
Tenga cuidado, 'Collator.getInstance () 'sin explícita' Locale' depende del entorno: _Returna una instancia de Collator que es apropiada para la ** configuración regional predeterminada del usuario **. Consulte "[Tenga cuidado con la configuración regional predeterminada] (http://developer.android.com/reference/java/util/Locale.html#default_locale)" ._ – Xaerxess
Gracias por la advertencia, pero estoy en duda ahora. Necesito ordenar los datos solo para mostrarlos al usuario, no enviarlos a algún lugar o calcular algo ... ¿Entonces probablemente la configuración regional predeterminada es suficiente? Pero si quisiera clasificar correctamente los caracteres alemanes y daneses y usarlos como salida de máquina, ¿entonces la mejor opción sería usar la configuración regional 'Local.US'? – lomza