2010-11-19 3 views
6

Ecco l'ordine locale alfabeto: wikipedia
Ecco il mio codice:Collator non lo fa sorta giusto per data Locale

public static void main(String[] args) { 
    Locale loc = new Locale("sr","RS"); 

    Collator col = Collator.getInstance(loc); 
    col.setStrength(Collator.SECONDARY); 

    List<String> slova = new ArrayList<String>(); 

    slova.add("Austrija"); 
    slova.add("Slovačka"); 
    slova.add("Č"); 
    slova.add("Đ"); 
    slova.add("C"); 
    slova.add("Grčka"); 
    slova.add("Slovenija"); 
    slova.add("Španija"); 
    slova.add("Švajcarska"); 
    slova.add("Švedska"); 
    slova.add("Srbija"); 

    Collections.sort(slova,col); 

    for(String s: slova) 
     System.out.println(s); 
} 

Ed ecco l'output:

Austrija
C
Č
Grčka
Slovačka
Slovenija
Španija
Srbija
Švajcarska
Švédská
©

Come si può vedere dal link qui sopra non è questo l'ordine corretto.
Cosa sto sbagliando?

+0

Le parole che iniziano con S e Š sono miste e Đ non dovrebbe essere alla fine. – cbaby

+0

L'ipotesi che tutti possano vedere che l'output è sbagliato è fortemente esagerata. –

+1

Ecco perché ho aggiunto il link con l'ordine alfabetico in alto e ho aggiunto un commento che indicava cosa c'era di sbagliato nell'output. – cbaby

risposta

-1

Appena scoperto è un problema noto causato da circostanze politiche e linguistiche. Grazie per l'aiuto.

+2

Non ne sono così sicuro. Le regole di ordinamento vengono acquisite da varie versioni di Unicode Standard (unicode.org). La versione standard corrente (6.0) può avere regole di ordinamento corrette per Serbia, ma Java implementa qualche snapshot precedente. Si prega di dare un'occhiata all'implementazione dell'ICU: http://icu-project.org/apiref/icu4j/com/ibm/icu/text/Collator.html e vedere se è l'ordinamento nel modo giusto. –

1

Penso che il problema potrebbe essere che non c'è paese in ISO-3166 con RS codice

+1

http://www.iso.org/iso/english_country_names_and_code_elements e quando chiamo getAvailableLocales() su Collator ottengo sr_RS tra gli altri. – cbaby

3

Come ho scoperto sulla tua pagina wikipedia e @Vash il suo legame ISO. Penso che intendi per "sr" Serbia? Quindi dovrai scegliere "cs" come paese.

Modifica: dipende dalla versione di java che si utilizza. Java 6 utilizza il nuovo standard iso.

+0

Il link di Vash punta a codici iso obsoleti. Ho controllato le impostazioni locali supportate e Collator supporta sr_RS e legacy sr_CS. L'uso di sr_CS restituisce lo stesso risultato. – cbaby

+0

ISO-3166 non può essere superato per definizione. Il collegamento è dalla documentazione di Java. –

0

Se l'ordinamento desiderato non è disponibile, è possibile creare il proprio ordine con uno RuleBasedCollator. Non essere spaventato dalla documentazione di questa classe. È facile come:

String rules = "< a < b < c < ç < d ..."; 
RuleBasedCollator myRuleBased = new RuleBasedCollator(rules); 
Collections.sort(myList, myRuleBased); 
+0

Beh, non risolve il mio problema in quanto ho bisogno di fare ordinamento basato su molte Locales ottenute dinamicamente, il che significherebbe che dovrei definire una regola che comprenderebbe oltre 40 lingue diverse. Anche se fossi disposto a scrivere un mostro simile, sarebbe stato anche un incubo peggiore mantenerlo. Ho scelto di sostituire "sr" con Locale locale simile. – cbaby