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

1

Программа сортирует массив в порядке возрастания, но при замене 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]));
    }
}
Теги:

6 ответов

3
Лучший ответ

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

Переехать

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

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

  • 0
    Ты обалденный! Спасибо :)
1

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

Это не показатель числа!

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

Вы должны вызвать метод compareTo() для экземпляра Integer, а не static compare()

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

int id;
public int compareTo(Example ob) {

        Integer compareid = ob.id;
        return compareid.compareTo(id);
    }
  • 0
    В самом деле? Я получаю вывод: 3 2 0 1 - затем процесс завершается
  • 0
    Хорошо, это вызывает метод CompareTo класса Integer :)
0

Метод compareTo называется естественным методом сравнения.

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

ссылка

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

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

Поскольку для сортировки вашего массива по возрастанию/убыванию вы также меняете метод compareTo в example для сравнения для <соответственно> (т. compareTo Вы меняете логику в методе 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]". Это немного сложно, подумайте об этом.

0

Вы используете 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) перед сортировкой массива.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню