Есть ли способ сортировки строк на всех языках? - PullRequest
12 голосов
/ 03 октября 2011

У меня есть этот код.Сортирует правильно по французски и по русски.Я использовал Locale.US, и это кажется правильным.Это решение подходит для всех языков?Работает ли это с другими языками?Например: китайский, корейский, японский ... Если нет, то какое решение лучше?

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

Обновление: Извините, этот набор не должен содержать все языкис целью.Я имею в виду, что этот набор содержит один язык и правильно сортируется на всех языках.

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

Ответы [ 3 ]

23 голосов
/ 03 октября 2011

Из-за каждого языка свой алфавитный порядок вы не можете. Например,

В указанном вами русском языке с буква имеет другой порядок, чем в турецком языке.

Вы всегда должны использовать коллатор. Что я могу вам предложить, так это нам API коллекции.

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

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

Для дальнейшей проверки информации и как указано здесь

Эта программа показывает, что может произойти, если вы отсортируете один и тот же список слов с помощью двух разных коллатеров:

Collator fr_FRCollator = Collator.getInstance (новая локаль ("fr", "FR"));

Collator en_USCollator = Collator.getInstance (новая локаль ("en", "US"));

Метод сортировки, называемый sortStrings, может использоваться с любым Collator. Обратите внимание, что метод sortStrings вызывает метод сравнения:

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

Английский Collator сортирует слова следующим образом:

персик PECHE pêche Грех

Согласно правилам сопоставления французского языка, предыдущий список находится в неправильном порядке. Во французском péche должен следовать pêche в отсортированном списке. Французский Collator правильно сортирует массив слов следующим образом:

персик pêche PECHE грех

10 голосов
/ 03 октября 2011

Даже если вы могли точно определить используемый язык, полезные порядки сопоставления обычно относятся к конкретной комбинации язык + страна. И даже в пределах языка + страны параметры сортировки могут различаться в зависимости от использования или определенных настроек.

Однако, если вам нужно отсортировать произвольные наборы текста, лучше всего подойдет алгоритм сортировки Unicode , который определяет независимую от языка сортировку для любого текста Unicode. Алгоритм настраивается, но не обязательно дает результаты, которые имеют смысл для какой-либо одной культуры (и определенно не для всех).

Классы сортировки Java не реализуют этот алгоритм, но он доступен как часть RuleBaseCollator ICU .

0 голосов
/ 03 октября 2011

Насколько я знаю, у китайцев нет порядка для их языка, у японцев возможен порядок в хирагане или катакане, но в кандзи это сомнительно.Но в компьютерной науке все представлено числами, то же самое относится и к языкам.Каждый знак соответствует уникальному номеру Юникода.Так что это может быть решением для вас, сортируйте слова, используя их UNICODE позиции.

...