2012-10-08 30 views
18

La ordenación de una cadena con número se realiza de forma diferente de un idioma a otro. Por ejemplo, en los dígitos en inglés vienen antes las letras en una clasificación ascendente. Pero, en alemán, los dígitos son ascendentes ordenados por letras.Clasificación lingüística (alemán) con Java

traté de ordenar cadenas utilizando un Collator de la siguiente manera:

private Collator collator = Collator.getInstance(Locale.GERMANY); 
collator.compare(str1, str2) 

Pero por encima de la comparación no tiene en cuenta los dígitos después de la regla letras.

¿Alguien tiene una idea de por qué Java no está tomando esta regla (dígitos después de la carta) en cuenta, por el momento estoy usando RuleBasedCollator de la siguiente manera:

private final String sortOrder = "< a, A < b, B < c, C < d, D < e, E < f, F < g, G < h, H < i, I < j, J < k, K < l, L < m, M < n, N < o, O < p, P < q, Q < r, R < s, S < t, T < u, U < v, V < w, W < x, X < y, Y < z, Z < 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9"; 

private Collator collator = new RuleBasedCollator(sortOrder); 
+6

¿Es deliberado que usted no tiene acentos y el Sharp-s (áéíóúüñ) en el orden de clasificación? Diría que son importantes para tener un colega alemán. –

+0

sí, para el caso de prueba he omitido diéresis y caracteres especiales. solo quería mantenerlo muy simple. – Amir

+4

También: ¿qué reglas sigues para ordenar los dígitos después de los otros caracteres? Hay varias intercalaciones diferentes para alemán y al menos algunos de esos números de clasificación primero. –

Respuesta

13

Usted puede comprobar/depurar el código fuente para ver qué nada cambia:

Collator.getInstance(Locale.GERMANY); 

Llama al siguiente código de pieza:

public static synchronized 
Collator getInstance(Locale desiredLocale) 
{ 
    // Snipping some code here 
    String colString = ""; 
    try { 
     ResourceBundle resource = LocaleData.getCollationData(desiredLocale); 

     colString = resource.getString("Rule"); 
    } catch (MissingResourceException e) { 
     // Use default values 
    } 
    try 
    { 
     result = new RuleBasedCollator(CollationRules.DEFAULTRULES + 
             colString, 
             CANONICAL_DECOMPOSITION); 
    } 
// Snipping some more code here 

Aquí se puede ver que las reglas específicas (colString que están vacías en su caso de todos modos) se colocan después de los valores predeterminados (CollationRules.DEFAULTRULES).

Y como usted ha descubierto que los incumplimientos se han colocado los valores numéricos en primer lugar:

// NUMERICS 

    + "<0<1<2<3<4<5<6<7<8<9" 
    + "<\u00bc<\u00bd<\u00be" // 1/4,1/2,3/4 fractions 

    // NON-IGNORABLES 
    + "<a,A" 
    + "<b,B" 
    + "<c,C" 
    + "<d,D" 
Cuestiones relacionadas