2012-08-10 18 views
7

Tengo un problema en la comparación de strings.I quieren comparar dos "Ed" y "EF" textos francés como estojava CollationKey clasificación errónea

Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE); 
CollationKey a = localeSpecificCollator.getCollationKey("éd"); 
CollationKey b = localeSpecificCollator.getCollationKey("ef"); 
System.out.println(a.compareTo(b)); 

Esto imprimirá -1, pero en alfabeto francés e presento ante é. Pero cuando comparamos solamente e y é como este resultado

Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE); 
CollationKey a = localeSpecificCollator.getCollationKey("é"); 
CollationKey b = localeSpecificCollator.getCollationKey("e"); 
System.out.println(a.compareTo(b)); 

es 1. ¿Puedes decirnos qué está mal en la primera parte del código?

+1

que tienen la "misma cuestión" (creo que bastante aceptable) con '' Swing' Comparator' y sus implementaciones para RowSorter' 'y' RowFilter' en '' JTable' para Win1250-2' eq. 'ISO 8859-1/2', para todos los no-ASCII Cuando los tanques se ordenan en el extremo, por ejemplo, e -> e IE, lo siento nunca necesitó resuelto eso, porque es bastante aceptable y ordenación lógica con – mKorbel

Respuesta

3

Este parece ser el comportamiento esperado y también parece ser la forma correcta de ordenar alfabéticamente en francés.

El Android javadoc da una pista sobre por qué se comporta de esa manera - supongo que los detalles de la aplicación en Android son similares, si no idénticas, a la JDK estándar:

Una diferencia terciaria se ignora cuando hay una diferencia primaria o secundaria en cualquier parte de las cadenas.

En otras palabras, debido a que sus 2 cadenas se pueden clasificar al solo mirar las diferencias primarias (excluyendo los acentos), el intercalador no verifica las otras diferencias.

Parece ser compatible con el Unicode Collation Algorithm (UCA):

diferencias de acento suelen ignorar, si las letras básicas difieren.

Y aussi parece ser la forma correcta de escribir en orden alfabético en francés, selon la wikipedia article on "ordre alphabetique":

En el primer análisis, los caracteres acentuados, así como la capital, tienen el mismo rango alfabético que el carácter fundamental
Si hay varias palabras tienen el mismo rango alfabético, tratamos de distinguirlos gracias a la superior y acentos (por correo era el orden e, e, e, e, e)

En Inglés: ignorar la orden INICIALMENTE acentos y caso - si dos palabras no pueden ser ordenados de esa manera, los acentos y el caso se tienen en cuenta continuación.

0

Desde el JavaDoc:

Puede establecer la propiedad de la fuerza de un clasificador para determinar el nivel de diferencia considerada significativa en las comparaciones. Se proporcionan cuatro puntos fuertes: PRIMARIO, SECUNDARIO, TERCIARIO e IDENTICO. La asignación exacta de las fortalezas a las características del lenguaje depende de la configuración regional. Por ejemplo, en checo, "e" y "f" se consideran diferencias principales, mientras que "e" y "ě" son diferencias secundarias, "e" y "E" son diferencias terciarias y "e" y "e" son idénticas .

probar diferentes fortalezas:

localeSpecificCollator.setStrength(Collator.PRIMARY); 

y ver qué pasa.

+1

He intentado todas las ganancias de fuerza , objetivo que no ayudó – Ashot

+1

@Tichodroma Las diferencias secundario/terciario no se toman en cuenta si hay diferencias primarias. – assylias

Cuestiones relacionadas