Сравнительный вариант использования сравнения - PullRequest
0 голосов
/ 15 марта 2019
package Comparable;

public class Movie implements Comparable<Movie> {

    private double rating;
    private String name;
    private int year;

    @Override
    public int compareTo(Movie m) {
        // TODO Auto-generated method stub
        return this.year - m.year;
    }

    public Movie(double rating, String name, int year) {
        this.rating = rating;
        this.name = name;
        this.year = year;
    }    
}

Основной класс:

package Comparable;

import java.util.ArrayList;
import java.util.Collections;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ArrayList<Movie> list = new ArrayList<Movie>();
        list.add(new Movie(8.8, "Force Awakens", 2015));
        list.add(new Movie(7.7, "Star Wars", 1977));
        list.add(new Movie(9.9, "Empire Strikes back", 1980));
        list.add(new Movie(3.2, "Return of the jedi", 1983));

        // Sort the items based on the pararmeter mentioned in the compareTo method
        // .Here the sort pareameter is the year of the release.
        Collections.sort(list);

        System.out.println("Movie after sorting :"+"\n");
        for (Movie movie : list) {
            System.out.println(movie.getName() + " " + movie.getRating() + " " + movie.getYear());
        }
    }

}

У меня есть приведенный выше вариант использования compareTo.Я хотел понять, что метод compareTo делает под капотом.Когда я переопределил метод compareTo и решил отсортировать по 'году';как происходит сравнение?Я могу понять, что он возвращает 1, -1 и 0 в соответствии с результатом сравнения.Но как происходит сравнение в приведенной ниже строке кода:

 return this.year - m.year; 

Когда я говорю this.year, это код, принимающий первый элемент, т.е.

8.8, "Force Awakens", 2015

и сравнивающий со всемиэлементов списка, то есть элементов объекта movie, переданных в метод compareTo, описанный выше?

Как происходит сравнение объектов?

Ответы [ 3 ]

2 голосов
/ 15 марта 2019

Вот документация по методу Collections.sort(..), вот что он говорит:

Сортирует указанный список в порядке возрастания в соответствии с естественным порядком его элементов.Все элементы в списке должны реализовывать интерфейс Comparable.Кроме того, все элементы в списке должны быть взаимно сопоставимы (то есть e1.compareTo (e2) не должно создавать исключение ClassCastException для любых элементов e1 и e2 в списке).

И вот каксортировка выполнена:

Эта реализация выгружает указанный список в массив, сортирует массив и выполняет итерацию по списку, сбрасывая каждый элемент с соответствующей позиции в массиве.Это позволяет избежать производительности n2 log (n), которая может возникнуть в результате попытки отсортировать связанный список на месте.

Так что да, так что вы правы.Он выбирает каждый элемент из списка и сравнивает его с другими элементами, используя compareTo.

0 голосов
/ 15 марта 2019

Класс Movie имеет метод compareTo, определенный таким образом, что this Фильм считается «большим», чем other Фильм, если this Фильм был выпущен позднее, чем other Фильм.Если они вышли в один и тот же год, их считают равными.Если other фильм вышел позже, он считается «меньшим».

Пример

Сравнение фильмов this = (8.8, "Force Awakens", 2015) и other = (7.7, "Star Wars", 1977):

return this.year - other.year
return 2015 - 1977
return 38 // i.e. this > other

Обратите внимание, чтоесли вы перевернете фильмы, вы получите противоположный результат, как и следовало ожидать при заказе.

Принцип

Таким образом, "под капотом" программа может вывести, что

(8.8, «Пробуждение силы», 2015)> (3.2, «Возвращение джедая», 1983)> (9.9, «Империя наносит ответный удар», 1980)> (7.7, «Звездные войны»,1977)

в значительной степени путем выборки результатов для вызова compareTo для различных пар фильмов.Точные детали реализации метода сортировки, такие как используемый алгоритм, не имеют особого значения, и это отвлечено от вас.Важной частью является то, что вы делаете сортировку возможной, определяя естественное упорядочение, то есть позволяя программе последовательно выбирать для любой пары Movie объектов, какой из двух «больше».

0 голосов
/ 15 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...