2011-10-03 7 views
12

Mam ten kod. Sortuje poprawnie w języku francuskim i rosyjskim. Użyłem Locale.US i wydaje się, że to prawda. Czy to rozwiązanie działa dobrze we wszystkich językach? Czy działa z innymi językami? Na przykład: chiński, koreański, japoński ... Jeśli nie, jakie jest lepsze rozwiązanie?Czy istnieje sposób sortowania ciągów we wszystkich językach?

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

Aktualizacja: Niestety, nie wymaga ten zestaw musi zawierać wszystkie języki w kolejności. Mam na myśli, że ten zestaw zawiera jeden język i poprawnie sortuje w każdym języku.

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

I nie sądzę, że można sensownie zdefiniować kolejność słów inter-językowych. – Flexo

+3

Nawet jeśli zestaw zawiera tylko jeden język, nadal musisz wybrać poprawne 'Locale' dla' Collator' za każdym razem, gdy chcesz sortować. –

Odpowiedz

21

Ponieważ każdy język ma swój własny porządek alfabetyczny, nie można tego zrobić. Na przykład:

Język rosyjski, o którym mowa, ma numer с i ma inną kolejność niż język turecki.

Powinieneś zawsze używać kompatu. Mogę ci zaproponować interfejs API zbierania.

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

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

w celu uzyskania dalszych informacji i sprawdzenia jak stwierdzono here

Ten program pokazuje, co może się zdarzyć podczas sortowania tę samą listę słów z dwoma różnymi kolatorów:

Zbieraczka fr_FRCollator = Collator.getInstance (nowa Locale ("fr", "FR"));

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

Metoda sortowania, nazywana sortStrings, może być używana z dowolnym Zbieraczem.Należy zauważyć, że metoda sortStrings wywołuje metodę porównywania:

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

Angielski Zbieraczka sortuje słowa następująco:

brzoskwinię Peche pêche grzech

Zgodnie z zasadami sortowania języka francuskiego , poprzednia lista jest w złej kolejności. W języku francuskim péché powinno znajdować się na posortowanej liście. Francuski Zbieraczka sortuje tablicę słów prawidłowo, co następuje:

brzoskwinia pêche Peche grzech

1

O ile mi wiadomo, Chińczycy nie mają żadnego nakazu ich języka, Japanes możliwych mieć porządek w Hiragana i Katakana, ale Kanji jest wątpliwe. Ale w komputerze sience wszystko jest reprezentowane przez liczby to samo dotyczy języków. Każdy znak odpowiada unikatowemu numerowi UNICODE. To może być rozwiązanie dla ciebie, posortuj słowa używając ich pozycji UNICODE.

+2

Znaki chińskiego hanzi i japońskiego kanji można sortować według radykałów i liczby uderzeń. –

9

Nawet jeśli można dokładnie wykryć używany język, przydatne polecenia sortowania są zwykle charakterystyczne dla konkretnej kombinacji języka i kraju. Nawet w języku + kraju sortowanie może się różnić w zależności od użycia lub niektórych dostosowań.

Jeśli jednak chcesz sortować dowolne zestawy tekstów, najlepiej jest wybrać opcję Unicode Collation Algorithm, która definiuje niezależne od języka sortowanie dla dowolnego tekstu w kodzie Unicode. Algorytm jest dostosowywany, ale nie musi dawać wyników, które mają sens dla każdej kultury (i zdecydowanie nie dla nich).

Klasy sortowania Java nie implementują tego algorytmu, ale jest on dostępny jako część ICU's RuleBaseCollator.

+1

W języku java używasz ustawień regionalnych (""), aby uzyskać ustawienia regionalne (w języku Java 7 istnieje stała Locale.ROOT). Collator dla tego ustawienia narodowego to UCA. –

Powiązane problemy