Сортировка целых чисел в java сначала возвращает отрицательные числа?

#java #sorting

#java #сортировка

Вопрос:

У меня есть такой компаратор:

 Collections.sort( sortedPlayers, new Comparator<RoundPlayer>()
{
    public int compare(RoundPlayer p1, RoundPlayer p2)
    {
        return p1.getScore() - p2.getScore();
    }
});
 

Отсортированные игроки — это список объектов игрока, оценки, которые они возвращают, — это целые числа, такие как, 200, -300, 1000 и т.д.

Цель компаратора — отсортировать их так, чтобы они были в порядке убывания, 1000, 200, -300.

Однако этот компаратор, похоже, возвращает ошибочные результаты. Часто сначала выводятся отрицательные числа.

Комментарии:

1. Это беспорядочно или в порядке возрастания?

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

3. Отрицательные числа всегда предшествуют положительным числам в естественном порядке. mathatube.com/sitebuilder/images/number-line-600×271.png

4. Мне почти интересно, упорядочивает ли это каким-то образом по величине вместо последовательного порядка…. Не могли бы вы предоставить пример ввода с соответствующим выводом?

5. Какой тип возвращаемого getScore() значения? Может ли быть целое число под /overflow ?

Ответ №1:

Просто измените возвращаемое значение, которое у вас есть в данный момент

пример

 return p2.getScore() - p1.getScore(); //will sort in descending order
 

Ответ №2:

Если вы хотите выполнить сортировку по убыванию, рассмотрите возможность переноса с Comparator помощью Collections.ReverseOrder(Comparator cmp).

Также обратите внимание, что вычитание двух значений — плохая идея из-за переполнения целых чисел. Ваша compare логика такова p1.getScore() - p2.getScore() . Рассмотрим p1.score = 2147483647, p2.score = -2147483648, ваш компаратор вернет -1, неправильно указав, что оценка p1 меньше, чем оценка p2.

Правильная логика — проверять < , = и > , возвращая -1, 0 и 1 . Еще лучше, Integer уже реализует эту логику, поэтому вы можете просто делегировать ее compareTo методу.

 return Integer.valueOf(p1.getScore()).compareTo(Integer.valueOf(p2.getScore());
 

Комментарии:

1. Я искал «список объектов сортировки отрицательных чисел Android» в Google, и она направила меня сюда к вашему замечательному объяснению в качестве первого результата. Кажется, это был бы редкий случай проблемы, но я пытался отсортировать список файлов MediaStore на основе их идентификаторов корзины, которые с ошибкой, которую я заметил, отрицательные значения идентификаторов корзины могут быть источником проблемы. Ваша информация мне очень помогла.