Как работает Collections.sort, когда мы всегда возвращаем одно и то же значение из метода compare или compareTo - PullRequest
0 голосов
/ 26 сентября 2019

Рассмотрим этот код ниже:

class Employee implements Comparable<Employee>{

    int id;

    public Employee(int i) {
        this.id=i;
    }

    @Override
    public int compareTo(Employee other) {
        return -1;
    }

    public String toString() {

        return String.valueOf(id);
    }   
}

public class S13_0 {
     public static void main(String[] args) {
         List<Employee> list=Arrays.asList(new Employee(40),new Employee(67),new Employee(32));
         Collections.sort(list);
         System.out.println(list);
    }
}

В этом коде мы просто используем список объектов сотрудников с идентификаторами [40,67,32] и делаем сотрудника сопоставимым.теперь я уже знаю, что, как правило, работает сопоставимый.но я просто хотел знать в этом случае, когда мы возвращаем -1 (отрицательное целочисленное значение) независимо от ввода, то как метод сортировки применяется к списку и печатает список в обратном порядке.

Output is : [32, 67, 40]

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Вам "повезло", что sort() не бросил IllegalArgumentException: Comparison method violates its general contract!

"Общий контракт", на который он ссылается, задокументирован в javadoc: Comparable.compareTo(T o):

Разработчик должен обеспечить sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) для всех x и y.(Это означает, что x.compareTo(y) должно выдать исключение, если y.compareTo(x) выдает исключение.)

Разработчик также должен обеспечить транзитивность отношения: (x.compareTo(y)>0 && y.compareTo(z)>0) подразумевает x.compareTo(z)>0.

Наконец, разработчик должен убедиться, что x.compareTo(y)==0 означает, что sgn(x.compareTo(z)) == sgn(y.compareTo(z)) для всех z.

Ваш код нарушает первое правило.

Таким образом,результат сортировки: undefined .

0 голосов
/ 26 сентября 2019

Возврат фиксированного значения из сравнения нарушает договор.Таким образом, результаты не определены и зависят от реализации.

Если вы хотите узнать, почему вы получаете определенные результаты с конкретной реализацией, изучите эту реализацию, чтобы понять, как именно она работает, - единственное решение.

...