Метод Java Collections.Sort Comparison нарушает его общий контракт - PullRequest
0 голосов
/ 14 октября 2019

Со вчерашнего дня в моем коде появляется ошибка, и я не знаю почему! Я много гуглил и нашел этот Stack-Post.

Я использую эту функцию для сортировки пользователей по имени и дате создания. Эта функция работает с 2 лет, и теперь я получаю сообщение об ошибке для одного пользователя, и я не знаю, что изменилось. Я пытался проверить свои данные, если что-то повреждено, но не смог найти ничего плохого.

После прочтения zhe Stack-Post я все еще не до конца понял, в чем проблема или что изменилось в моем проекте.

public void sortUsers(List<Users> sortList) {
    Collections.sort(sortList, new Comparator<Users>() {
        public int compare(Users user1, Users user2) {
            Integer comp = 0;
            comp = user1.getUsername().compareTo(user2.getUsername());
            if (comp == 0) {
                comp = user1.getCreateDate().before(user2.getCreateDate()) ? -1 : 1;
            }

            return comp;
        }
    });
}

1 Ответ

9 голосов
/ 14 октября 2019
comp = user1.getCreateDate().before(user2.getCreateDate()) ? -1 : 1;

Эта строка никогда не может вернуть ноль, если даты совпадают. Это означает, что он не является антисимметричным (то есть sgn(a.compareTo(b)) = -sgn(b.compareTo(a))).

Точное исправление зависит от того, какой класс getCreateDate() возвращает, но это может быть что-то вроде:

comp = user1.getCreateDate().compareTo(user2.getCreateDate());

Однакоболее простой способ создания совместимого компаратора:

Comparator.comparing(Users::getUsername).thenComparing(Users::getCreateDate)

или аналогичный.

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