Изучаю алгоритм сортировки выборки. Рассмотрим эту реализацию:

http://algs4.cs.princeton.edu/21elementary/Selection.java.html

У меня есть текстовый файл с такими словами в Юникоде.

$ more words.txt
şeftali içel ırak üzüm uzun çorba çimen ufuk

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

$ java-algs4 Selection < words.txt
içel
ufuk
uzun
çimen
çorba
üzüm
ırak
şeftali

Моя первая попытка заключалась в использовании подборщика.

import java.util.*;
import java.text.*;

public class StringSorter
{
    public static void sortStrings(Collator c, String[] words)
    {
        String tmp;

        for (int i = 0; i < words.length; ++i)
        {
            for (int j = 0; j < words.length; ++j)
            {
                if (c.compare(words[i], words[j]) < 0)
                {
                    tmp = words[i];
                    words[i] = words[j];
                    words[j] = tmp;
                }
            }
        }
    }

    public static void printStrings(String[] words)
    {
        for (int i = 0; i < words.length; ++i)
        {
            System.out.println(words[i]);
        }
    }

    public static void main(String[] args)
    {
        Collator tr_TRCollator = Collator.getInstance(new Locale("tr", "TR"));

        String[] words = {"şeftali", "içel", "ırak", "üzüm", "uzun", "çorba", "çimen", "ufuk"};
        sortStrings(tr_TRCollator, words);
        printStrings(words);
    }

}

Эта программа правильно сортирует слова, как и ожидалось.

$ java-algs4 StringSorter
çimen
çorba
ırak
içel
şeftali
ufuk
uzun
üzüm

Мой вопрос в том, как реализовать алгоритм сортировки выбора с учетом Unicode в Java?

Также метод сортировки Selection.class принимает объект Comparator в качестве второго параметра. Можно ли написать нашу собственную реализацию интерфейса Comparator, чтобы он мог правильно сортировать элементы Unicode.

 public static void sort(Object[] a, Comparator c)

Любая помощь будет оценена. Благодарность..

1
Erdem 24 Фев 2016 в 15:53

3 ответа

Лучший ответ

Класс Collator реализует интерфейс Comparator, поэтому вы можете просто передать tr_TRCollator в Selection.sort в качестве второго параметра.

1
Matt Timmermans 24 Фев 2016 в 13:32

Важным моментом является то, что во втором примере используются настройки локали. Порядок сортировки строк зависит от языкового стандарта и не имеет ничего общего с кодовыми точками Unicode символов. Даже страны, которые используют один и тот же язык, например, Австрия, Германия и Швейцария, имеют небольшие различия в порядке сортировки строк.

0
Frank Puffer 24 Фев 2016 в 13:08

Вы можете нормализовать строки и выполнить сравнение в Юникоде, если они совпадают.

String[] words = "şeftali içel ırak üzüm uzun çorba çimen ufuk".split(" ");
Arrays.sort(words, Comparator.comparing((String w) -> 
                                        Normalizer.normalize(w, Normalizer.Form.NFD))
                             .thenComparing(Comparator.naturalOrder()));
Stream.of(words).forEach(System.out::println);

Отпечатки

çimen
çorba
içel
şeftali
ufuk
uzun
üzüm
ırak

Это близко, но не рассматривает ı как i

0
Peter Lawrey 24 Фев 2016 в 13:07