Объясните, пожалуйста, суть работы метода compareTo() на примере, описанном на странице https://javarush.com/groups/posts/1885-metod-compareto.
Я понимаю, что в методе main создается объект, допустим,
User user = new User("Андрей", 19, "andryha@mail.ru");
Понимаю, что User заимствует интерфейс Comparable с переопределенным методом compareTo(). А что дальше происходит, я не могу понять, потому что метод объектом нигде не вызывается.
Далее, в примере кода в разделе статьи "Реализуем сравнение в своем классе" имеется строка 18:
int result = this.name.compareTo(o.name);
В метод compareTo передаются данные (o.name или ""Андрей""). А что это за вызывающий объект this их сравнивает? Что присвоено его переменной name?
Я в таком ауте...
kolomimber13
17 уровень
Как понять работу метода compareTo()?
Архивный
Комментарии (8)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Иван Борзов
12 июля 2020, 10:09полезный
В строке примера сравниваются поля name у двух экземпляров объекта типа User, поэтому сначала указывается поле name первого экземпляра this.name (текущего в заданном контексте, поэтому компилятор понимает без названия, просто this) и поле name второго экземпляра o.name, а в классе User в реализации метода comareTo() прописываются правила сравнения, какие для Вас требуются (по алфавиту|по длине|по количеству букв "М", напрмер).
В целом, функционал еще шире и можно было бы передавать в метод поросто ссылку на объекты, например, this.compareTo(another). И уже в реализации метода описать, что сравниваются определенные поля этих объектов и по какому правилу.
Бытовой пример. Ты - метод. Тебе передают для сравнения 2 машины и спрашивают какая из них больше. Что ты будешь измерять? Объем, клиренс, диаметр колеса, массу? Вариантов много, поэтому тебе должны задать это самое правило сравнения. В твоей реализации должны прописать "измеряй колеса", например, или "массу, поделенную на объем"(тут уже будут два поля участвовать в сравнении)...
+1
kolomimber13
12 июля 2020, 13:32
Я процитирую часть первого Вашего предложения:
"В строке примера сравниваются поля name у двух экземпляров объекта типа User, поэтому сначала указывается поле name первого экземпляра this.name (текущего в заданном контексте, поэтому компилятор понимает без названия, просто this) и поле name второго экземпляра o.name,...".
Вы можете на примере указать, какие инициализированные значения переменных сравниваются? Я не улавливаю логики - создается один объект, в конструктор которого отправляется аргумент. С переменной какого объекта переданный аргумент сравнивается?
0
Ksenia VolkovaJava Developer в DXCMaster
12 июля 2020, 13:42
Метод compareTo не может быть вызван сам по себе. Он не статический, он должен быть вызван у какого-то объекта. Этот объект и есть this. Кроме того, метод сompareTo в качестве параметра принимает еще один объет - User o.
Вот поля этих объектов - this и o - и сравниваются.
0
kolomimber13
12 июля 2020, 13:47
Но как они сравниваются? Вот создан экземпляр класса и в него переданы параметры, в том числе и name ("Андрей").
User user = new User("Андрей", 19, "andryha@mail.ru");
Тогда что в данном случае из себя представляет "'этот" объект со своим name?
0
Ksenia VolkovaJava Developer в DXCMaster
12 июля 2020, 13:58
Нельзя сравнивать один объект!
Очевидно же, что для сравнения нужны два.
Допустим:
Сравниваться будет name одного с name другого.
0
kolomimber13
12 июля 2020, 14:34
Боюсь, я окончательно перестал понимать, что я понимаю, а что нет...
Строка 3 user1.compareTo(user2) вернет целое значение (-1). И если бы это было всё, то вопросов бы не было.
Но как оно влияет на сортировку списка при вызове метода sort() из Collections?
0
Ksenia VolkovaJava Developer в DXCMaster
12 июля 2020, 14:40решение
Вспоминай, как на первых уровнях надо было сортировать массив чисел. Например, пузырьком - если предыдущий элемент больше следующего, меняем их местами...
Ну и вообще - для того чтобы отсортировать элементы, нам же надо как-то определить, какой должен идти раньше, а какой позже. Вот для этого нам и надо их сравнивать.
Если элемент А меньше элемента Б, значит (при сортировке по возрастанию) А должен быть ближе к началу, чем Б.
+2
Ksenia VolkovaJava Developer в DXCMaster
12 июля 2020, 08:35
Эта строка находится в переопределенном методе compareTo. Этот метод - нестатический, то есть он может быть вызван только у какого-то конкретного объекта (в данном случае - у какого-то объекта класса User). Вот к тому объекту, у которого вызван метод, мы и обращаемся с помощью this.
Вспиминай, ключевое слово this еще где-то на первых уровнях разбирается...
0