Fotonick
@Fotonick
android-er (Навальный отменит налоги фрилансерам)

Почему Collections.sort сортирует не одинаково?

В моём приложении есть 4 вкладки с данными в списках. Для сортировки данных по времени добавления использую порядковые номера id объектов. В трёх вкладках даные сортируются верно, а в последней нет.

То есть вот такой код
Collections.sort(allMentorsList, new Comparator<OneMentorClass>() {
                        @Override
                        public int compare(OneMentorClass o1, OneMentorClass o2) {
                            return o2.getMentorID().compareTo(o1.getMentorID());
                        }
                    });

работает правильно и сортирует весь список данных, а идентичный
Collections.sort(allLawyersList, new Comparator<OneLawyerClass>() {
                        @Override
                        public int compare(OneLawyerClass o1, OneLawyerClass o2) {
                            return o2.getLawyerID().compareTo(o1.getLawyerID());
                        }
                    });

нет и упорядочивает объекты как будто по парам, то есть в первой паре id первого объекта больше чем второго, и во второй паре id первого объекта больше чем второго, но во второй паре может быть объект с id больше чем у объекта в первой паре. Как такое может быть?

Во всех объектах запрашиваются идентичными методами идентичные данные в идентичных форматах переменных.
Может быть глюк компиляции? Использую последнюю Android Studio с canary channel и gradle в бета версии.

P.S.
Классы похожие, отличные только названием переменных и их количеством (лишние переменные в примере убрал)
то есть объекты этого класса сортирует нормально
public class OneMentorClass {
    private String mentorID;

    public OneMentorClass(String mentorID) {
        this.mentorID = mentorID;
    }

    public String getMentorID() {
        return mentorID;
    }
}


а объекты этого нет
public class OneLawyerClass {
    private String lawyerID;

    public OneLawyerClass(String lawyerID) {
        this.lawyerID = lawyerID;
    }

    public String getLawyerID() {
        return lawyerID;
    }


ПРИМЕР СОРТИРОВКИ Collections.sort
правильная сортировка
получает на вход allMentorsList с объектами в таком порядке id
mentorID=19
mentorID=20
mentorID=21
mentorID=23
mentorID=24
mentorID=31
Даёт на выход allMentorsList с объектами в порядке убывания id
mentorID=31
mentorID=24
mentorID=23
mentorID=21
mentorID=20
mentorID=19

Неправильная сортировка
получает на вход allLawyersList с объектами в таком порядке id
lawyerID=6
lawyerID=8
lawyerID=18
lawyerID=21
Даёт на выход allLawyersList с объектами в таком порядке id
lawyerID=8
lawyerID=6
lawyerID=21
lawyerID=18
  • Вопрос задан
  • 456 просмотров
Решения вопроса 2
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
ID у вас String. Он их сравнивает в лексикографическом порядке, потому что не знает, что это числа. Поэтому 25 больше чем что 100, например (потому что 2 больше 1). Вы посмотрите - айдишники у вас в порядке убывания первой цифры получились. Нужно парсить их как числа или писать свой компаратор, который правильно сравнивать будет.
Кроме того, когда сортируемые элементы у вас Comparable, вовсе не надо писать свой компаратор для обратного порядка. Есть Collections.reverseOrder().
Ответ написан
Комментировать
Fotonick
@Fotonick Автор вопроса
android-er (Навальный отменит налоги фрилансерам)
После наводки Денис Загаевский переписал вот так
Collections.sort(allLawyersList, new Comparator<OneLawyerClass>() {
                        @Override
                        public int compare(OneLawyerClass o1, OneLawyerClass o2) {
                            return Integer.parseInt(o1.getLawyerID()) < Integer.parseInt(o2.getLawyerID()) ? 1
                                    : (Integer.parseInt(o1.getLawyerID()) > Integer.parseInt(o2.getLawyerID()) ? -1 : 0);
                        }
                    });
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы