Как работает компаратор Java внутри?

#java #comparator

#java #компаратор

Вопрос:

 class Checker implements Comparator<Player> {
    @Override
    public int compare(Player p1, Player p2) {
        if (p1.score == p2.score) {
            return p1.name.compareTo(p2.name);
        } else {
            return p2.score - p1.score;
        }
    }
}
  

как p2.score — p1.score позволяет ему опускаться
в то время как p1.score — p2.score делает, это возрастает

как положительное или отрицательное целое число или нулевой возврат сортирует объекты? что происходит внутри

пожалуйста, помогите, спасибо

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

1.Мне нравится думать об этом так: a<b также может быть записан как a-b<0 . Другими словами, когда a<b compare(a,b) должно быть возвращено значение, которое <0 . Когда a==b тогда compare(a,b) должен вернуться 0 . Когда a>b compare(a,b) должно быть возвращено значение >0 . Основываясь на этом, алгоритмы сортировки (которые по умолчанию пытаются упорядочить «от наименьшего к наибольшему») принимают решение, следует ли в настоящее время сравнивать пару элементов a и b , поменять их местами или нет.

2. docs.oracle.com/javase/8/docs/api/java/util/Comparator.html Для математически склонных отношение, которое определяет наложенный порядок, который данный компаратор c налагает на данный набор объектов S, является: {(x, y) таким, что c.compare(x, y) <= 0}. Коэффициент для этого общего порядка равен: {(x, y) такой, что c.compare(x, y) == 0}.

Ответ №1:

Из Comparator документации:

Функция сравнения, которая налагает полный порядок на некоторую коллекцию объектов. …

И из Comparator:compare документации:

ВОЗВРАТ:

отрицательное целое число, ноль или положительное целое число в качестве первого аргумента меньше, равно или больше второго.

Таким образом, Comparator определяет только порядок. Алгоритм сортировки должен использовать эту информацию и фактически сортировать структуру данных. Если мы посмотрим, как, например, работают быстрая сортировка и сортировка слиянием, мы увидим, что этим алгоритмам нужно только знать, является ли какой-либо элемент a меньшим, равным или большим, чем b , что является информацией, которую Comparator предоставляет a < 0 (возвращая значение = 0 , > 0 или,,,,).

Теперь давайте объясним, как a - b он выполняет сортировку в порядке возрастания (давайте дадим этому Comparator имя asc ), в то время как b - a он выполняет сортировку в порядке убывания ((давайте дадим этому Comparator имя desc ): мы должны рассмотреть три разных случая для двух Comparator s.

Во-первых, предположим, что a > b . Затем

  • a - b > 0 , таким образом, a «больше», чем b согласно asc
  • b - a < 0 , таким образом, a «меньше», чем b согласно desc

Далее предположим, что a < b . Затем

  • a - b < 0 таким образом, a «меньше», чем b согласно asc
  • b - a > 0 , таким образом, a «больше», чем b согласно desc

Наконец, предположим, что a == b . Тогда a - b == b - a == 0 и элементы «равны» в соответствии с обоими Comparator значениями.

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

1. как я узнаю, меньше или больше a, чем b. сравнивается ли первый объект в моем массиве первым со вторым?

2. Как я уже сказал: пожалуйста, посмотрите на некоторые известные алгоритмы сортировки, такие как быстрая сортировка и сортировка слиянием. Везде, где эти алгоритмы используют < , == или > , вызывается Comparator::compare -метод и вычисляется его возвращаемое значение ( < 0 для < , == 0 для == и > 0 для > ).