Сортировка объектов по строковому полю, включая символы, специфичные для языка - PullRequest
0 голосов
/ 04 сентября 2018

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

Collections.sort(myList, Collator.getInstance());

Но проблема в том, что он работает только тогда, когда я пытаюсь отсортировать список строк. Когда я пытаюсь отсортировать список своих объектов, я получаю java.lang.ClassCastException. Как я могу отсортировать список своих объектов в алфавитном порядке на польском языке?

Мой объект выглядит примерно так:

public class MyObject implements Comparable<MyObject>{
     private String name;
     ...

     @Override
    public int compareTo(@NonNull MyObject object) {
        return name.compareTo(object.getName());
    }

И сейчас я пытаюсь отсортировать это так:

List<MyObject> myList = DataProvider.getInstance().getListOfObjects();    
Collections.sort(myList, Collator.getInstance());

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Collator используется для сравнения строк, вы можете извлечь имя, а затем передать их Collator:

myList.sort((o1, o2) -> Collator.getInstance().compare(o1.getName(), o2.getName()));
0 голосов
/ 04 сентября 2018

Я полагаю, что в документации Collator есть некоторая неопределенность.

Collator - это Comparator<Object>, но оно действительно нацелено на выполнение

чувствительный к локали String сравнение (акцент мой).

Это лучше видно в документации Collator#compare для конкретной реализации :

Эта реализация просто возвращает сравнение ((String)o1, (String)o2).


Полученное ClassCastException, скорее всего, связано с тем фактом, что MyObject не является String.


Я бы попробовал перенести использование Collator в вашу фактическую реализацию compareTo:

Collections.sort(myList);

... и в вашей compareTo реализации:

Collator.getInstance().compare(name, object.getName());

Обратите внимание, что идиома Collator.getInstance() использует значение по умолчанию Locale.

Поэтому, если вы планируете использовать несколько Locale s для сравнения ваших объектов в зависимости от контекста, вам может быть лучше сортировать с помощью пользовательского Comparator, который позволяет вводить Locale и использовать Collator под капотом. ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...