Рубрики

Сравнение с Компаратором в Java

Java предоставляет два интерфейса для сортировки объектов с использованием данных-членов класса:

  1. сравнимый
  2. компаратор

Использование сопоставимого интерфейса

Сопоставимый объект способен сравнивать себя с другим объектом. Сам класс должен реализовывать интерфейс java.lang.Comparable для сравнения его экземпляров.

Рассмотрим класс Кино, в котором есть такие члены, как рейтинг, имя, год. Предположим, мы хотим отсортировать список фильмов по году выпуска. Мы можем реализовать интерфейс Comparable с классом Movie и переопределить метод compareTo () интерфейса Comparable.

// Java-программа для демонстрации использования Comparable

import java.io.*;

import java.util.*;

  
// Класс Movie, реализующий Comparable

class Movie implements Comparable<Movie>

{

    private double rating;

    private String name;

    private int year;

  

    // Используется для сортировки фильмов по году

    public int compareTo(Movie m)

    {

        return this.year - m.year;

    }

  

    // Конструктор

    public Movie(String nm, double rt, int yr)

    {

        this.name = nm;

        this.rating = rt;

        this.year = yr;

    }

  

    // Методы получения для доступа к частным данным

    public double getRating() { return rating; }

    public String getName()   {  return name; }

    public int getYear()      {  return year;  }

}

  
// Класс водителя

class Main

{

    public static void main(String[] args)

    {

        ArrayList<Movie> list = new ArrayList<Movie>();

        list.add(new Movie("Force Awakens", 8.3, 2015));

        list.add(new Movie("Star Wars", 8.7, 1977));

        list.add(new Movie("Empire Strikes Back", 8.8, 1980));

        list.add(new Movie("Return of the Jedi", 8.4, 1983));

  

        Collections.sort(list);

  

        System.out.println("Movies after sorting : ");

        for (Movie movie: list)

        {

            System.out.println(movie.getName() + " " +

                               movie.getRating() + " " +

                               movie.getYear());

        }

    }

}

Выход:

 Фильмы после сортировки: 
Звездные войны 8,7 1977
Империя наносит ответный удар 8,8 1980
Возвращение джедая 8.4 1983
Пробуждение силы 8,3 2015 

Теперь предположим, что мы хотим сортировать фильмы по их рейтингу и названиям. Когда мы делаем элемент коллекции сопоставимым (если он реализует Comparable), мы получаем только один шанс реализовать метод compareTo (). Решение использует Comparator.

Использование компаратора

В отличие от Comparable, Comparator является внешним по отношению к типу элемента, который мы сравниваем. Это отдельный класс. Мы создаем несколько отдельных классов (которые реализуют Comparator) для сравнения различными членами.

Класс коллекций имеет второй метод sort () и использует Comparator. Метод sort () вызывает метод compare () для сортировки объектов.

Чтобы сравнить фильмы по рейтингу, нам нужно сделать 3 вещи:

  1. Создайте класс, который реализует Comparator (и, следовательно, метод compare (), который выполняет работу, ранее проделанную методом compareTo ()).
  2. Сделайте экземпляр класса Comparator.
  3. Вызовите перегруженный метод sort (), передав ему список и экземпляр класса, который реализует Comparator.

// Java-программа для демонстрации интерфейса Comparator

import java.io.*;

import java.util.*;

  
// Класс Movie, реализующий Comparable

class Movie implements Comparable<Movie>

{

    private double rating;

    private String name;

    private int year;

  

    // Используется для сортировки фильмов по году

    public int compareTo(Movie m)

    {

        return this.year - m.year;

    }

  

    // Конструктор

    public Movie(String nm, double rt, int yr)

    {

        this.name = nm;

        this.rating = rt;

        this.year = yr;

    }

  

    // Методы получения для доступа к частным данным

    public double getRating() { return rating; }

    public String getName()   {  return name; }

    public int getYear()      {  return year;  }

}

  
// Класс для сравнения фильмов по рейтингу

class RatingCompare implements Comparator<Movie>

{

    public int compare(Movie m1, Movie m2)

    {

        if (m1.getRating() < m2.getRating()) return -1;

        if (m1.getRating() > m2.getRating()) return 1;

        else return 0;

    }

}

  
// Класс для сравнения фильмов по имени

class NameCompare implements Comparator<Movie>

{

    public int compare(Movie m1, Movie m2)

    {

        return m1.getName().compareTo(m2.getName());

    }

}

  
// Класс водителя

class Main

{

    public static void main(String[] args)

    {

        ArrayList<Movie> list = new ArrayList<Movie>();

        list.add(new Movie("Force Awakens", 8.3, 2015));

        list.add(new Movie("Star Wars", 8.7, 1977));

        list.add(new Movie("Empire Strikes Back", 8.8, 1980));

        list.add(new Movie("Return of the Jedi", 8.4, 1983));

  

        // Сортировка по рейтингу: (1) Создать объект рейтингаСравнить

        // (2) Call Collections.sort

        // (3) Распечатать отсортированный список

        System.out.println("Sorted by rating");

        RatingCompare ratingCompare = new RatingCompare();

        Collections.sort(list, ratingCompare);

        for (Movie movie: list)

            System.out.println(movie.getRating() + " " +

                               movie.getName() + " " +

                               movie.getYear());

  

  

        // Вызов перегруженного метода сортировки с RatingCompare

        // (те же три шага, что и выше)

        System.out.println("\nSorted by name");

        NameCompare nameCompare = new NameCompare();

        Collections.sort(list, nameCompare);

        for (Movie movie: list)

            System.out.println(movie.getName() + " " +

                               movie.getRating() + " " +

                               movie.getYear());

  

        // Используется для сортировки по годам

        System.out.println("\nSorted by year");

        Collections.sort(list);

        for (Movie movie: list)

            System.out.println(movie.getYear() + " " +

                               movie.getRating() + " " +

                               movie.getName()+" ");

    }

}  

Выход :

Sorted by rating
8.3 Force Awakens 2015
8.4 Return of the Jedi 1983
8.7 Star Wars 1977
8.8 Empire Strikes Back 1980

Sorted by name
Empire Strikes Back 8.8 1980
Force Awakens 8.3 2015
Return of the Jedi 8.4 1983
Star Wars 8.7 1977

Sorted by year
1977 8.7 Star Wars 
1980 8.8 Empire Strikes Back 
1983 8.4 Return of the Jedi 
2015 8.3 Force Awakens  
  • Comparable предназначен для объектов с естественным упорядочением, что означает, что сам объект должен знать, как его упорядочить. Например, бросить числа студентов. Принимая во внимание, что сортировка интерфейса Comparator осуществляется через отдельный класс.
  • Логически, интерфейс Comparable сравнивает ссылку «this» с указанным объектом, а Comparator в Java сравнивает два предоставленных объекта класса.
  • Если какой-либо класс реализует интерфейс Comparable в Java, то коллекция этого объекта, либо List, либо Array, может быть отсортирована автоматически с использованием метода Collections.sort () или Arrays.sort (), а объекты будут отсортированы в соответствии с их естественным порядком, определенным методом CompareTo.

Подводя итог, если сортировка объектов должна быть основана на естественном порядке, тогда используйте Comparable, тогда как если вам нужно выполнить сортировку по атрибутам различных объектов, тогда используйте Comparator в Java.

Эта статья предоставлена Souradeep Barua. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Сравнение с Компаратором в Java

0.00 (0%) 0 votes