2011-10-03 13 views
12

Ho questo codice. Ordina correttamente in francese e russo. Ho usato Locale.US e sembra giusto. La soluzione fa bene con tutte le lingue là fuori? Funziona con altre lingue? Ad esempio: cinese, coreano, giapponese ... In caso contrario, qual è la soluzione migliore?C'è un modo per ordinare le stringhe in tutte le lingue?

public class CollationTest { 
    public static void main(final String[] args) { 
     final Collator collator = Collator.getInstance(Locale.US); 
     final SortedSet<String> set = new TreeSet<String>(collator); 

     set.add("abîmer"); 
     set.add("abîmé"); 
     set.add("aberrer"); 
     set.add("abhorrer"); 
     set.add("aberrance"); 
     set.add("abécédaire"); 
     set.add("abducteur"); 
     set.add("abdomen"); 

     set.add("государственно-монополистический"); 
     set.add("гостить"); 
     set.add("гостевой"); 
     set.add("гостеприимный"); 
     set.add("госпожа"); 
     set.add("госплан"); 
     set.add("господи"); 
     set.add("господа"); 

     for(final String s : set) { 
      System.out.println(s); 
     } 
    } 
} 

Aggiornamento: Siamo spiacenti, non richiedo questo set deve contenere tutte le lingue in ordine. Voglio dire che questo set contiene una lingua e ordina correttamente in tutte le lingue.

public class CollationTest { 
    public static void main(final String[] args) { 
     final Collator collator = Collator.getInstance(Locale.US); 
     final SortedSet<String> set = new TreeSet<String>(collator); 

     // Sorting in French. 
     set.clear(); 
     set.add("abîmer"); 
     set.add("abîmé"); 
     set.add("aberrer"); 
     set.add("abhorrer"); 
     set.add("aberrance"); 
     set.add("abécédaire"); 
     set.add("abducteur"); 
     set.add("abdomen"); 
     for(final String s : set) { 
      System.out.println(s); 
     } 

     // Sorting in Russian. 
     set.clear(); 
     set.add("государственно-монополистический"); 
     set.add("гостить"); 
     set.add("гостевой"); 
     set.add("гостеприимный"); 
     set.add("госпожа"); 
     set.add("госплан"); 
     set.add("господи"); 
     set.add("господа"); 
     for(final String s : set) { 
      System.out.println(s); 
     } 
    } 
} 
+4

Non credo che si può definire un significato ordinamento delle parole inter-lingua. – Flexo

+3

Anche se il set contiene solo una lingua, sarà comunque necessario selezionare il 'Locale' corretto per il' Collator' ogni volta che si desidera ordinare. –

risposta

21

A causa di ogni lingua ha il proprio ordine alfabetico non si può. Ad esempio,

lingua russa come avete dichiarato ha с lettera ha un ordine diverso rispetto lingua turca.

Si dovrebbe sempre usare il collettore. Quello che posso suggerirti è per noi Raccolta API.

// 
    // Define a collator for German language 
    // 
    Collator collator = Collator.getInstance(Locale.GERMAN); 

    // 
    // Sort the list using Collator 
    // 
    Collections.sort(words, collator); 

Per futher di controllo le informazioni e come dichiarato here

Questo programma mostra ciò che può accadere quando si ordina lo stesso elenco di parole con due diversi raccoglitrici:

Collator fr_FRCollator = Collator.getInstance (new locale ("fr", "FR"));

Collator en_USCollator = Collator.getInstance (new Locale ("it", "US"));

Procedimento selezionare, chiamati sortStrings, può essere utilizzato con qualsiasi Collator.Si noti che il metodo sortStrings invoca il metodo confrontare:

public static void sortStrings(Collator collator, 
          String[] words) { 
    String tmp; 
    for (int i = 0; i < words.length; i++) { 
     for (int j = i + 1; j < words.length; j++) { 
      if (collator.compare(words[i], words[j]) > 0) { 
       tmp = words[i]; 
       words[i] = words[j]; 
       words[j] = tmp; 
      } 
     } 
     } 
} 

L'inglese Collator ordina le parole come segue:

pesca péché pêche peccato

Secondo le regole di confronto della lingua francese , l'elenco precedente è nell'ordine sbagliato. In francese péché dovrebbe seguire pêche in una lista ordinata. Il Collator francese ordina l'array di parole in modo corretto, come segue:

pesca pêche péché peccato

1

Per quanto so, i cinesi non hanno alcun ordine per il loro linguaggio, i Japanes possibili hanno l'ordine nel Hiragana o Katakana, ma in Kanji è dubbio. Ma nei computer sience tutto è rappresentato dai numeri che la stessa cosa vale per le lingue canta. Ogni segno corrisponde al numero UNICODE univoco. Quindi questa potrebbe essere la soluzione per te, ordina le parole usando le loro posizioni UNICODE.

+2

I caratteri hanzi cinesi e kanji giapponesi possono essere ordinati per numero di tratti e di tratti. –

9

Anche se si potrebbe rilevare con precisione la lingua in uso, gli ordini di confronto utili sono di solito specifiche di un particolare combinazione linguistica + paese. E anche all'interno di una lingua + paese, le regole di confronto possono variare in base all'utilizzo o a determinate personalizzazioni.

Tuttavia, se è necessario ordinare insiemi di testo arbitrari, la soluzione migliore è lo Unicode Collation Algorithm, che definisce una fascicolazione indipendente dalla lingua per qualsiasi testo Unicode. L'algoritmo è personalizzabile, ma non è necessario fornire risultati che abbiano senso per qualsiasi cultura (e sicuramente non tra loro).

classi di confronto di Java non implementano questo algoritmo, ma è disponibile come parte del ICU's RuleBaseCollator.

+1

In java si utilizza Locale ("") per ottenere le impostazioni locali di root (in Java 7 è presente una costante Locale.ROOT). il Collator per questa lingua è l'UCA. –

Problemi correlati