Подтвердить что ты не робот

Есть ли способ сортировки строк на всех языках?

У меня есть этот код. Он правильно сортируется на французском и русском языках. Я использовал 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);
        }
    }
}

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

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

Ответ 1

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

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

Вы всегда должны использовать коллатор. То, что я могу вам предложить, - это API-интерфейс Collection.

    //
    // 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éché должен следовать за pêche в отсортированном списке. Французский Collator правильно сортирует массив слов следующим образом:

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

Ответ 2

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

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

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

Ответ 3

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