2012-02-21 15 views
7

¿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

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ęść] 
+0

¡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

+1

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

+0

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