Как работает метод сравнения?

#java

#java

Вопрос:

Программа сортирует массив в порядке возрастания, но при замене id и compareid в инструкции return массив сортируется в порядке убывания, но это никак не влияет на результат, который System.out.println(e[1].compareTo(e[0])); он возвращает 1 в обоих случаях. Почему это так?

 package example;

import java.util.Arrays;

class Example implements Comparable<Example> {
    int id;

    public int compareTo(Example ob) {
        int compareid = ob.id;
        return Integer.compare(id, compareid); // problem
    }
}

class comparableinterface {
    public static void main(String args[]) {
        Example e[] = new Example[3];
        e[0] = new Example();
        e[0].id = 2;
        e[1] = new Example();
        e[1].id = 3;
        e[2] = new Example();
        e[2].id = 0;
        Arrays.sort(e);
        for (Example temp : e) {
            System.out.println(temp.id);
        }
        System.out.println(e[1].compareTo(e[0]));
    }
}
  

Ответ №1:

Потому что ваше сравнение выполняется после того, как вы отсортировали массив, а Arrays.sort(e) изменяет содержимое массива e.

Переместить

 System.out.println(e[1].compareTo(e[0]));
  

перед сортировкой, и она будет вести себя так, как вы ожидали.

Ответ №2:

Результат compareTo отражает определенный порядок между объектом и аргументом. Это всегда будет 1 между первым и вторым в отсортированном массиве, отсортированном в соответствии с тем, что выражается compareTo.

Это не указывает на числовое отношение!

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

1. Я думаю, что это один из немногих правильных ответов здесь. Я имел в виду то же самое в своем ответе, так что 1 от меня.

Ответ №3:

Вы используете Integer.compare(id,compareid) в своем переопределенном compareTo(Example ob) методе, и для вашей информации,

Integer.compare(id,compareid) возвращает значение 0, если id == compareid; значение меньше 0, если id < compareid; и значение больше 0, если id > compareid.

И вы вызываете compareTo(Example ob) после сортировки массива, вот почему метод всегда возвращает 1 .

Попробуйте вызвать compareTo(Example ob) перед сортировкой массива.

Ответ №4:

Метод compareTo упоминается как его естественный метод сравнения.

Считается, что естественный порядок для класса C согласуется с equals тогда и только тогда, когда e1.compareTo(e2) == 0 имеет то же логическое значение, что и e1.equals (e2) для каждого e1 и e2 класса C.

Ссылка

Смотрите также java.utils.Исходный код Arrays.mergeSort(), позволяющий увидеть, как compareTo используется для сортировки массива:

 for (int j=i; j>low amp;amp;
             ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
                    swap(dest, j, j-1);
  

Ответ №5:

Потому что для сортировки вашего массива по возрастанию / убыванию вы также меняете свой compareTo метод в example на compare для < соответственно> (т. Е. вы меняете логику в методе compareTo). Вот почему он дает вам тот же результат из System.out.println(e[1].compareTo(e[0])); . По сути, после изменения ваш compareTo больше не проверяет «меньше», а проверяет «больше». Таким образом, даже несмотря на то, что System.out.println(e[1].compareTo(e[0])); возвращает 1 в обоих случаях, в первом случае он сообщает вам «e [1] больше, чем e[0]», а во втором случае он сообщает вам «e[1] меньше, чем e [0]». Это довольно сложно, подумайте об этом.

Ответ №6:

Вы должны вызвать метод compareTo() для экземпляра целого числа, а не статический compare()

Попробуйте это:

 int id;
public int compareTo(Example ob) {

        Integer compareid = ob.id;
        return compareid.compareTo(id);
    }
  

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

1. Действительно? Я получаю вывод: 3 2 0 1 — затем процесс завершается

2. Хорошо, это вызывает метод compareTo класса Integer 🙂