2012-10-08 15 views
18

L'ordinamento di una stringa con il numero viene eseguito in modo diverso da una lingua all'altra. Ad esempio, in cifre in inglese vengono prima delle lettere in un ordinamento crescente. Ma, in tedesco, le cifre sono ascendenti ordinate dopo le lettere.Ordinamento linguistico (tedesco) con Java

Ho cercato di ordinare le stringhe utilizzando un Collator come segue:

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

Ma soprattutto il confronto non si tiene conto cifre dopo regola lettere.

Se uno ha un idea del perché Java non sta prendendo questa regola (cifre dopo la lettera) in considerazione per il momento che sto usando RuleBasedCollator come segue:

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

E 'intenzionale che non si dispone di dieresi e la Sharp-s (äöüß) nel vostro ordinamento? Direi che sono importanti per avere un collezionista tedesco. –

+0

sì, per il caso di test ho omesso umlaut e caratteri speciali. volevo solo tenerlo molto semplice. – Amir

+4

Inoltre: quali regole si seguono le cifre di ordinamento dopo gli altri caratteri? Esistono diverse regole di confronto per il tedesco e almeno alcuni di questi numeri per primi. –

risposta

13

È possibile controllare/debug del codice sorgente per vedere il motivo per cui nulla cambia:

Collator.getInstance(Locale.GERMANY); 

chiamate il seguente codice pezzo:

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 

Qui puoi vedere che le regole specifiche (colString che sono vuote nel tuo caso comunque) sono poste dopo le di default (CollationRules.DEFAULTRULES).

E come avete scoperto che le impostazioni predefinite sono i valori numerici al primo posto:

// 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" 
Problemi correlati