2011-10-03 18 views
12

Tengo este código. Se ordena correctamente en francés y ruso. Usé Locale.US y parece estar bien. ¿Esta solución funciona bien con todos los idiomas? ¿Funciona con otros idiomas? Por ejemplo: chino, coreano, japonés ... Si no, ¿cuál es la mejor solución?¿Hay alguna manera de ordenar cadenas en todos los idiomas?

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); 
     } 
    } 
} 

Actualización: Lo sentimos, no necesito este conjunto debe contener todos los idiomas en orden. Me refiero a que este conjunto contiene un idioma y ordena correctamente en todos los idiomas.

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

No creo que se puede definir de manera significativa una ordenación de palabras entre idiomas. – Flexo

+3

Incluso si el conjunto solo contiene un idioma, igual tendrá que seleccionar el 'local 'correcto para' Collator' cada vez que desee ordenar. –

Respuesta

21

Debido a que cada idioma tiene su propio orden alfabético no se puede. Por ejemplo,

idioma ruso como indicaste tiene с carta tiene un orden diferente al del idioma turco.

Siempre debe usar el clasificador. Lo que puedo sugerirte es para nosotros Collection API.

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

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

Para la comprobación de información adicional de entrega y como se indica here

Este programa muestra lo que puede suceder cuando se ordena la misma lista de palabras con dos alzadoras diferentes:

Compaginadora fr_FRCollator = Collator.getInstance (nueva Locale ("fr", "FR"));

Collator en_USCollator = Collator.getInstance (nueva Locale ("en", "US"));

El método de clasificación, llamado sortStrings, se puede utilizar con cualquier intercalador.Observe que el método sortStrings invoca el método de comparación:

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; 
      } 
     } 
     } 
} 

la alzadora Inglés ordena las palabras de la siguiente manera:

melocotón péché pêche pecado

De acuerdo con las normas de clasificación de la lengua francesa , la lista anterior está en el orden incorrecto. En francés, péché debería seguir a Pêche en una lista ordenada. El Compaginadora francesa ordena la matriz de palabras correctamente, de la siguiente manera:

melocotón pêche péché pecado

1

En lo que sé, los chinos no tienen ningún orden para su idioma, los japones posibles tienen el orden en el Hiragana o Katakana, pero en kanji es dudoso. Pero en las computadoras, todo está representado por números, lo mismo ocurre con los idiomas. Cada signo corresponde al número UNICODE único. Así que esta podría ser la solución para usted, clasifique las palabras usando sus posiciones UNICODE.

+2

Los caracteres chinos hanzi y kanji japonés se pueden ordenar por radicales y recuento de trazos. –

9

Incluso si pudiera detectar con precisión el idioma utilizado, las órdenes de intercalación útiles suelen ser específicas para una combinación particular de idioma + país. E incluso dentro de un país de idioma +, la intercalación puede variar según el uso o ciertas personalizaciones.

Sin embargo, si necesita ordenar conjuntos de texto arbitrarios, su mejor opción es Unicode Collation Algorithm, que define una intercalación independiente del idioma para cualquier texto Unicode. El algoritmo es personalizable, pero no necesariamente da resultados que tengan sentido para cualquier cultura (y definitivamente no a través de ellas).

Las clases de intercalación de Java no implementan este algoritmo, pero está disponible como parte de ICU's RuleBaseCollator.

+1

En java, usa la configuración regional ("") para obtener la configuración regional de la raíz (en Java 7 hay una constante Locale.ROOT). el intercalador de este lugar es el UCA. –

Cuestiones relacionadas