Рубрики

Интерфейс компаратора в Java с примерами

Интерфейс компаратора используется для упорядочивания объектов пользовательских классов. Объект сравнения может сравнивать два объекта двух разных классов. Следующая функция сравнивает obj1 с obj2

Синтаксис:

 public int Compare (Объект obj1, Объект obj2): 

Предположим, у нас есть массив / массив данных нашего собственного типа класса, содержащий такие поля, как rollno, name, address, DOB и т. Д., И нам нужно отсортировать массив на основе Roll no или name?

Метод 1 : Один очевидный подход — написать нашу собственную функцию sort (), используя один из стандартных алгоритмов. Это решение требует переписывания всего кода сортировки для различных критериев, таких как номер рулона и имя.

Способ 2. Использование интерфейса компаратора. Интерфейс компаратора используется для упорядочения объектов определенного пользователем класса. Этот интерфейс присутствует в пакете java.util и содержит 2 метода сравнения (Object obj1, Object obj2) и equals (Элемент Object). Используя компаратор, мы можем сортировать элементы на основе элементов данных. Например, это может быть имя, имя, возраст или что-то еще.

Метод класса Collections для сортировки элементов List используется для сортировки элементов List по заданному компаратору.

// To sort a given list. ComparatorClass must implement 
// Comparator interface.
public void sort(List list, ComparatorClass c)

Как работает Collections.Sort ()?
Внутренне метод Sort вызывает метод Compare классов, которые он сортирует. Чтобы сравнить два элемента, он спрашивает «Что больше?». Метод сравнения возвращает -1, 0 или 1, чтобы сказать, меньше ли он, равен или больше другого. Он использует этот результат, чтобы затем определить, следует ли их поменять местами для его сортировки.

Рабочая программа:

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

import java.util.*;

import java.lang.*;

import java.io.*;

  
// Класс для представления студента.

class Student

{

    int rollno;

    String name, address;

  

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

    public Student(int rollno, String name,

                               String address)

    {

        this.rollno = rollno;

        this.name = name;

        this.address = address;

    }

  

    // Используется для печати сведений о студенте в main ()

    public String toString()

    {

        return this.rollno + " " + this.name +

                           " " + this.address;

    }

}

  

class Sortbyroll implements Comparator<Student>

{

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

    // номер рулона

    public int compare(Student a, Student b)

    {

        return a.rollno - b.rollno;

    }

}

  

class Sortbyname implements Comparator<Student>

{

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

    // имя рулона

    public int compare(Student a, Student b)

    {

        return a.name.compareTo(b.name);

    }

}

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

class Main

{

    public static void main (String[] args)

    {

        ArrayList<Student> ar = new ArrayList<Student>();

        ar.add(new Student(111, "bbbb", "london"));

        ar.add(new Student(131, "aaaa", "nyc"));

        ar.add(new Student(121, "cccc", "jaipur"));

  

        System.out.println("Unsorted");

        for (int i=0; i<ar.size(); i++)

            System.out.println(ar.get(i));

  

        Collections.sort(ar, new Sortbyroll());

  

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

        for (int i=0; i<ar.size(); i++)

            System.out.println(ar.get(i));

  

        Collections.sort(ar, new Sortbyname());

  

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

        for (int i=0; i<ar.size(); i++)

            System.out.println(ar.get(i));

    }

}

Выход:

Unsorted
111 bbbb london
131 aaaa nyc
121 cccc jaipur

Sorted by rollno
111 bbbb london
121 cccc jaipur
131 aaaa nyc

Sorted by name
131 aaaa nyc
111 bbbb london
121 cccc jaipu

Изменяя возвращаемое значение внутри метода сравнения, вы можете сортировать в любом порядке. например, в порядке убывания просто измените позиции a и b в приведенном выше методе сравнения.

Сортировать коллекцию по нескольким полям:

В предыдущих статьях мы обсуждали, как сортировать список объектов на основе одного поля с использованием интерфейса Comparable и Comparator. Но что если у нас есть требование сортировать объекты ArrayList в соответствии с более чем одним полем, например, во-первых, сортировать, по словам студента имя и во-вторых сортировать в зависимости от возраста студента.

Ниже приведена реализация вышеуказанного подхода:

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

  

import java.util.ArrayList;

import java.util.Collections;

import java.util.Iterator;

import java.util.List;

import java.util.Comparator;

  

class Student {

  

    // переменные-члены экземпляра

    String Name;

    int Age;

  

    // параметризованный конструктор

    public Student(String Name, Integer Age) {

        this.Name = Name;

        this.Age = Age;

    }

  

    public String getName() {

        return Name;

    }

  

    public void setName(String Name) {

        this.Name = Name;

    }

  

    public Integer getAge() {

        return Age;

    }

  

    public void setAge(Integer Age) {

        this.Age = Age;

    }

  

    // переопределение метода toString ()

    @Override

    public String toString() {

        return "Customer{" + "Name=" + Name + ", Age=" + Age + '}';

    }

  

    static class CustomerSortingComparator implements Comparator<Student> {

  

        @Override

        public int compare(Student customer1, Student customer2) {

  

            // для сравнения

            int NameCompare = customer1.getName().compareTo(customer2.getName());

            int AgeCompare = customer1.getAge().compareTo(customer2.getAge());

  

            // двухуровневое сравнение с использованием блока if-else

            if (NameCompare == 0) {

                return ((AgeCompare == 0) ? NameCompare : AgeCompare);

            } else {

                return NameCompare;

            }

        }

    }

  

    public static void main(String[] args) {

  

        // создаем ArrayList для хранения Student

        List<Student> al = new ArrayList<>();

  

        // создаем объекты клиента с помощью инициализации конструктора

        Student obj1 = new Student("Ajay", 27);

        Student obj2 = new Student("Sneha", 23);

        Student obj3 = new Student("Simran", 37);

        Student obj4 = new Student("Ajay", 22);

        Student obj5 = new Student("Ajay", 29);

        Student obj6 = new Student("Sneha", 22);

  

        // добавляем объекты клиента в ArrayList

        al.add(obj1);

        al.add(obj2);

        al.add(obj3);

        al.add(obj4);

        al.add(obj5);

        al.add(obj6);

  

        // перед сортировкой arraylist: итерация с использованием Iterator

        Iterator<Student> custIterator = al.iterator();

  

        System.out.println("Before Sorting:\n");

        while (custIterator.hasNext()) {

            System.out.println(custIterator.next());

        }

  

        // сортировка с использованием Collections.sort (al, компаратор);

        Collections.sort(al, new CustomerSortingComparator());

  

        // после сортировки arraylist: итерация с использованием расширенного цикла for

        System.out.println("\n\nAfter Sorting:\n");

        for (Student customer : al) {

            System.out.println(customer);

        }

    }

}

Выход:

Before Sorting:

Customer{Name=Ajay, Age=27}
Customer{Name=Sneha, Age=23}
Customer{Name=Simran, Age=37}
Customer{Name=Ajay, Age=22}
Customer{Name=Ajay, Age=29}
Customer{Name=Sneha, Age=22}


After Sorting:

Customer{Name=Ajay, Age=22}
Customer{Name=Ajay, Age=27}
Customer{Name=Ajay, Age=29}
Customer{Name=Simran, Age=37}
Customer{Name=Sneha, Age=22}
Customer{Name=Sneha, Age=23}

Ссылки:
http://www.dreamincode.net/forums/topic/169079-how-collectionssort-is-doing-its-stuff-here/
http://www.javatpoint.com/Comparator-interface-in-collection-framework

Эта статья предоставлена Rishabh Mahrsee . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогайте другим Geeks. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

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

Интерфейс компаратора в Java с примерами

0.00 (0%) 0 votes