Как решить неожиданное поведение пользовательского компаратора при сортировке списка объектов? - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь отсортировать список Объектов (называемых Напоминанием), которые отображаются в виде утилиты в моем приложении для Android. Я использую собственный компаратор для сравнения одной из переменных объекта, которая имеет тип int.

Мне удалось отсортировать список объектов, используя другую переменную, которая является датой. Пользовательский компаратор, который я сделал, прекрасно работает с объектами Date.

Это компаратор, который я использую для сортировки объектов, используя целочисленную переменную, которая в данном случае является «приоритетом» объекта.

public void sortByPriority(){
        Collections.sort(reminderList, new Comparator<Reminder>() {
            @Override
            public int compare(Reminder o1, Reminder o2) {
                return o1.getPriority() - o2.getPriority();
            }
        });
        reminderAdapter.notifyDataSetChanged();
    }

На макете есть кнопка, которая вызывает метод sortByPriority () выше. При щелчке он фактически выполняет некоторую операцию сортировки, но результаты не совпадают ни в списке, ни в обзоре переработчика.

Например, исходный набор данных выглядит примерно так (значения приоритетов находятся в диапазоне от 1 до 4, а приоритет принадлежит классу напоминаний)

(исходные данные: 4,1,1,4,2,3,2,1,1,2)

(отсортировано с помощью вышеуказанного компаратора: 1,1,1,2,2,4,1,2,3,4)

Похоже, что он собирается работать правильно, но что-то происходит в середине. (Кстати я хочу их в порядке убывания)

Я довольно новичок, поэтому, возможно, я все испортил. Большое спасибо за вашу помощь.

1 Ответ

1 голос
/ 03 апреля 2019

Метод compare в основном сообщает, какой из переданных параметров больше.

В вашем примере, если функция возвращает положительное число, это означает, что o1 больше, если 0, тоэто означает, что они равны.а если отрицательно, то o2 больше.

public int compare(Reminder o1, Reminder o2) {
 return o1.getPriority() - o2.getPriority();
}

Если вы хотите, чтобы они были в порядке убывания, вы можете сделать это двумя способами.Во-первых, изменив логику метода compare.

public int compare(Reminder o1, Reminder o2) {
 // o2 - o1 instead of o1 - o2
 return o2.getPriority() - o1.getPriority();
}

, а другой способ - с помощью Collections.reverseOrder() после сортировки списка.

Collections.sort(reminderList, Collections.reverseOrder());

и относительно неправильных значенийМожете ли вы проверить свои данные еще раз с учетом вышеупомянутой логики.

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