2011-01-11 13 views
8

Hi avere qualche pezzo di codice:lettera a ordinamento problema in Java

Collator col = Collator.getInstance(Locale.GERMAN); 

List< String> list = new ArrayList<String>(); 
list.add("ac"); 
list.add("äb"); 
list.add("aa"); 
list.add("bb"); 


Collections.sort(list,col); 
System.out.println(list); 

mi aspetto di ottenere [AA, AC, AB, BB] uscita, invece sto ottenendo: [AA, AB, ac, bb]

Non ho idea di cosa sto facendo male ... grazie in anticipo per l'aiuto.


Hi ringrazia tutti per le risposte.

Purtroppo requisiti del progetto dicono chiaramente che le stringhe devono essere ordinati in tale ordine: [AA, AC, AB, BB]: così ho provato ad usare questo codice:

String europeanRules = 
     ("< a,A ; \u00e0,\u00c0 ; \u00e1,\u00c1 ; \u00e2,\u00c2 ; \u00e3,\u00c3; \u00e4,\u00c4 ; \u00e5,\u00c5 ; \u00e6,\u00c6 "+ 
       "; \u0101,\u0100 ; \u0103,\u0102 ; \u0105,\u0104 " +  
     "< b,B < c,C ; \u00e7,\u00c7 ; \u0107,\u0106 ; \u0109,\u0108 ; \u010b,\u010a ; \u010d,\u010c " + 
     "< d,D ; \u010f,\u010e ; \u0111,\u0110 " + 
     "< e,E ; \u00e8,\u00c8 ; \u00e9,\u00c9 ; \u00ea,\u00ca ; \u00eb,\u00cb " + 
      "; \u0113,\u0112 ; \u0115,\u0114 ; \u0116,\u0117 ; \u0119,\u0118 ; \u011b,\u011a " + 
     "< f,F < g,G < h,H " + 
     "< i,I ; \u00ec,\u00cc ; \u00ed,\u00cd ; \u00ee,\u00ce ; \u00ef,\u00cf " + 
     "< j,J < k,K " + 
     "< l,L ; \u013a,\u0139 ; \u013c,\u013b ; \u013e,\u013d ; \u0140,\u013f ; \u0142,\u0141 " + 
     "< m,M < n,N ; \u00f1,\u00d1 ; \u0144,\u0143 ; \u0146,\u0145 ; \u0148,\u0147 " + 
     "< o,O ; \u00f2,\u00d2 ; \u00f3,\u00d3 ; \u00f4,\u00d4 ; \u00f5,\u00d5 ; \u00f6,\u00d6 ; \u00f8,\u00d8 " + 
      "; \u014d,\u014c ; \u014f,\u014e ; \u0151,\u0150 " + 
     "< p,P < q,Q < r,R ; \u0155,\u0154 ; \u0157,\u0156 ; \u0159,\u0158 " + 
     "< s,S ; \u015b,\u015a ; \u015d,\u015c ; \u015f,\u015e ; \u0161,\u0160 " + 
     "< t,T ; \u0163,\u0162 ; \u0165,\u0164 ; \u0167,\u0166 " + 
     "< u,U ; \u00f9,\u00d9 ; \u00fa,\u00da ; \u00fb,\u00db ; \u00fc,\u00dc ; \u0169,\u0168 ; \u016b,\u016a ; \u016d,\u016c " + 
      "; \u016f,\u016e ; \u0171,\u0170 ; \u0173,\u0172 " + 
     "< v,V < w,W ; \u0175,\u0174 " + 
     "< x,X < y,Y ; \u00fd,\u00dd ; \u00ff ; \u0177,\u0176 ; \u0178 " + 
     "< z,Z ; \u017a,\u0179 ; \u017c,\u017b ; \u017e,\u017d");  

    RuleBasedCollator col = null; 
    try { 
     col = new RuleBasedCollator(europeanRules); 
    } catch (ParseException e) { 
    } 
    col.setStrength(Collator.SECONDARY); 
    col.setDecomposition(Collator.FULL_DECOMPOSITION); 

    List< String> list = new ArrayList<String>(); 
    list.add("ac"); 
    list.add("äb"); 
    list.add("aa"); 
    list.add("bb");  
    Collections.sort(list,col); 
    System.out.println(list); 

00E4 è UTF- 8 codice per ä quindi ho capito che dovrebbe funzionare ok? O sto facendo qualcosa di sbagliato ... grazie in anticipo per l'aiuto.

+1

Sospetto in il locale tedesco non considera le dieresi come un altro personaggio. Prova in inglese/Stati Uniti - anche se non sono sicuro di come funzionerà anche con le decorazioni in Unicode. –

+0

Perché dovresti aspettarti in questo ordine? –

+0

dovrebbe 'äb' essere ordinato prima di' af' o dopo? – Philipp

risposta

8

L'ordine che si ottiene è corretta, almeno secondo la Wikipedia entry per questo argomento (mi dispiace in tedesco, Google Translate potrebbe aiutare, anche se corrompe le dieresi per me ...)

+0

hai ragione. L'ordinamento ** è ** corretto. 'ä' è ordinato come' ae' –

+1

Ma non dovresti 'äb' ('aeb') venire dopo' ac' allora? –

+6

Bene, secondo Wikipedia, ci sono due varianti nella norma DIN 5007: la prima (da usare per le parole) tratta ä e una come la stessa, la seconda (da usare per i nomi) tratta ä e ae come stesso. Java sembra implementare il primo, che trovo sensato. –

2

Se volete che il vostro accentata i caratteri devono sempre venire dopo quelli normali, è possibile anteporre un valore @ nella regola definita per lo RuleBasedCollator.

Le definizioni degli elementi regola è la seguente:

[...]

Modifier: Non ci sono due modificatori che si accendono regole speciali di confronto.

'@': Si accende a ritroso l'ordinamento di accenti (differenze secondarie), come in francese.

'! ': Attiva lo scambio di consonanti vocali Thai/Lao. Se questa regola è in vigore quando una vocale tailandese dell'intervallo \ U0E40- \ U0E44 precede una consonante thailandese dell'intervallo \ U0E01- \ U0E2E OPPURE una vocale Lao dell'intervallo \ U0EC0- \ U0EC4 precede una consonante Lao dell'intervallo \ U0E81- \ U0EAE quindi la vocale viene posizionata dopo la consonante per scopi di confronto.

[...]

Così il vostro codice di esempio sarebbe simile segue:

(ho fatto la modifica solo per il personaggio ä, cioè @\u00e4, @\u00c4)

String europeanRules = 
     ("< a,A ; \u00e0,\u00c0 ; \u00e1,\u00c1 ; \u00e2,\u00c2 ; \u00e3,\u00c3; @\u00e4,@\u00c4 ; \u00e5,\u00c5 ; \u00e6,\u00c6 "+ 
       "; \u0101,\u0100 ; \u0103,\u0102 ; \u0105,\u0104 " +  
     "< b,B < c,C ; \u00e7,\u00c7 ; \u0107,\u0106 ; \u0109,\u0108 ; \u010b,\u010a ; \u010d,\u010c " + 
     "< d,D ; \u010f,\u010e ; \u0111,\u0110 " + 
     "< e,E ; \u00e8,\u00c8 ; \u00e9,\u00c9 ; \u00ea,\u00ca ; \u00eb,\u00cb " + 
      "; \u0113,\u0112 ; \u0115,\u0114 ; \u0116,\u0117 ; \u0119,\u0118 ; \u011b,\u011a " + 
     "< f,F < g,G < h,H " + 
     "< i,I ; \u00ec,\u00cc ; \u00ed,\u00cd ; \u00ee,\u00ce ; \u00ef,\u00cf " + 
     "< j,J < k,K " + 
     "< l,L ; \u013a,\u0139 ; \u013c,\u013b ; \u013e,\u013d ; \u0140,\u013f ; \u0142,\u0141 " + 
     "< m,M < n,N ; \u00f1,\u00d1 ; \u0144,\u0143 ; \u0146,\u0145 ; \u0148,\u0147 " + 
     "< o,O ; \u00f2,\u00d2 ; \u00f3,\u00d3 ; \u00f4,\u00d4 ; \u00f5,\u00d5 ; \u00f6,\u00d6 ; \u00f8,\u00d8 " + 
      "; \u014d,\u014c ; \u014f,\u014e ; \u0151,\u0150 " + 
     "< p,P < q,Q < r,R ; \u0155,\u0154 ; \u0157,\u0156 ; \u0159,\u0158 " + 
     "< s,S ; \u015b,\u015a ; \u015d,\u015c ; \u015f,\u015e ; \u0161,\u0160 " + 
     "< t,T ; \u0163,\u0162 ; \u0165,\u0164 ; \u0167,\u0166 " + 
     "< u,U ; \u00f9,\u00d9 ; \u00fa,\u00da ; \u00fb,\u00db ; \u00fc,\u00dc ; \u0169,\u0168 ; \u016b,\u016a ; \u016d,\u016c " + 
      "; \u016f,\u016e ; \u0171,\u0170 ; \u0173,\u0172 " + 
     "< v,V < w,W ; \u0175,\u0174 " + 
     "< x,X < y,Y ; \u00fd,\u00dd ; \u00ff ; \u0177,\u0176 ; \u0178 " + 
     "< z,Z ; \u017a,\u0179 ; \u017c,\u017b ; \u017e,\u017d");  

    RuleBasedCollator col = null; 
    try { 
     col = new RuleBasedCollator(europeanRules); 
    } catch (ParseException e) { 
    } 
    col.setStrength(Collator.SECONDARY); 
    col.setDecomposition(Collator.FULL_DECOMPOSITION); 

    List< String> list = new ArrayList<String>(); 
    list.add("ac"); 
    list.add("äb"); 
    list.add("aa"); 
    list.add("af"); 
    list.add("bb");  
    Collections.sort(list,col); 
    System.out.println(list); 

Il l'output è:

[aa, ac, af, äb, bb]