logo

Інтерфейс Java Comparator

Інтерфейс Java Comparator використовується для впорядкування об’єктів визначеного користувачем класу.

Цей інтерфейс міститься в пакеті java.util і містить 2 методи compare(Object obj1,Object obj2) і equals(Object element).

Він забезпечує кілька послідовностей сортування, тобто ви можете сортувати елементи на основі будь-якого елемента даних, наприклад, rollno, імені, віку або будь-чого іншого.

Методи інтерфейсу компаратора Java

методопис
public int compare(Object obj1, Object obj2)Він порівнює перший об’єкт з другим об’єктом.
публічне логічне значення дорівнює (Object obj)Він використовується для порівняння поточного об'єкта з вказаним об'єктом.
публічне логічне значення дорівнює (Object obj)Він використовується для порівняння поточного об'єкта з вказаним об'єктом.

Клас колекції

Колекції клас надає статичні методи для сортування елементів колекції. Якщо елементи колекції мають Set або Map, ми можемо використовувати TreeSet або TreeMap. Однак ми не можемо сортувати елементи списку. Клас Collections також надає методи для сортування елементів типу List.

Метод класу Collections для сортування елементів List

public void сортування (список списку, компаратор c): використовується для сортування елементів списку за даним компаратором.


Приклад компаратора Java (незагальний старий стиль)

Розглянемо приклад сортування елементів List за віком та іменем. У цьому прикладі ми створили 4 класи Java:

  1. Student.java
  2. AgeComparator.java
  3. NameComparator.java
  4. Simple.java
Student.java

Цей клас містить три поля rollno, name і age і параметризований конструктор.

 class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } 
AgeComparator.java

Цей клас визначає логіку порівняння на основі віку. Якщо вік першого об’єкта більший, ніж другого, ми повертаємо додатне значення. Це може бути будь-яке значення, наприклад 1, 2, 10. Якщо вік першого об’єкта менший за вік другого об’єкта, ми повертаємо від’ємне значення, це може бути будь-яке від’ємне значення, і якщо вік обох об’єктів однаковий, ми повертаємо 0.

 import java.util.*; class AgeComparator implements Comparator{ public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } 
NameComparator.java

Цей клас забезпечує логіку порівняння на основі імені. У такому випадку ми використовуємо метод compareTo() класу String, який внутрішньо забезпечує логіку порівняння.

 import java.util.*; class NameComparator implements Comparator{ public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; return s1.name.compareTo(s2.name); } } 
Simple.java

У цьому класі ми друкуємо значення об’єкта шляхом сортування на основі імені та віку.

 import java.util.*; import java.io.*; class Simple{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); System.out.println('Sorting by Name'); Collections.sort(al,new NameComparator()); Iterator itr=al.iterator(); while(itr.hasNext()){ Student st=(Student)itr.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } System.out.println('Sorting by age'); Collections.sort(al,new AgeComparator()); Iterator itr2=al.iterator(); while(itr2.hasNext()){ Student st=(Student)itr2.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by age 105 Jai 21 101 Vijay 23 106 Ajay 27 

Приклад компаратора Java (загальний)

Student.java
 class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } 
AgeComparator.java
 import java.util.*; class AgeComparator implements Comparator{ public int compare(Student s1,Student s2){ if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } 
NameComparator.java

Цей клас забезпечує логіку порівняння на основі імені. У такому випадку ми використовуємо метод compareTo() класу String, який внутрішньо забезпечує логіку порівняння.

 import java.util.*; class NameComparator implements Comparator{ public int compare(Student s1,Student s2){ return s1.name.compareTo(s2.name); } } 
Simple.java

У цьому класі ми друкуємо значення об’єкта шляхом сортування на основі імені та віку.

 import java.util.*; import java.io.*; class Simple{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); System.out.println('Sorting by Name'); Collections.sort(al,new NameComparator()); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } System.out.println('Sorting by age'); Collections.sort(al,new AgeComparator()); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by age 105 Jai 21 101 Vijay 23 106 Ajay 27 

Інтерфейс Java 8 Comparator

Інтерфейс Java 8 Comparator — це функціональний інтерфейс, який містить лише один абстрактний метод. Тепер ми можемо використовувати інтерфейс Comparator як ціль призначення для лямбда-виразу або посилання на метод.

Методи інтерфейсу компаратора Java 8

методопис
int compare(T o1, T o2)Він порівнює перший об'єкт з другим об'єктом.
статичнийКомпаратор порівняння (Function keyExtractor)Він приймає функцію, яка витягує порівняльний ключ сортування з типу T, і повертає компаратор, який порівнює за цим ключем сортування.
статичне порівняння компаратора (функційний ключExtractor, компаратор keyComparator)Він приймає функцію, яка витягує ключ сортування з типу T, і повертає компаратор, який порівнює за цим ключем сортування за допомогою зазначеного компаратора.
статичний компаратор comparingDouble(ToDoubleFunction keyExtractor)Він приймає функцію, яка витягує ключ подвійного сортування з типу T, і повертає Comparator, який порівнює за цим ключем сортування.
статичний компаратор comparingInt(ToIntFunction keyExtractor)Він приймає функцію, яка витягує ключ сортування int з типу T, і повертає Comparator, який порівнює за цим ключем сортування.
статичний компаратор comparingLong(ToLongFunction keyExtractor)Він приймає функцію, яка витягує довгий ключ сортування з типу T, і повертає Comparator, який порівнює за цим ключем сортування.
логічне значення дорівнює (Object obj)Він використовується для порівняння поточного об'єкта з вказаним об'єктом.
статичнийКомпаратор naturalOrder()Він повертає компаратор, який порівнює порівнювані об’єкти в природному порядку.
статичний компаратор nullsFirst(компаратор компаратора)Він повертає компаратор, який розглядає null як менше, ніж ненульові елементи.
статичний компаратор nullsLast(компаратор компаратора)Він повертає компаратор, який розглядає null як більше, ніж ненульові елементи.
Типовий компаратор reversed()Він повертає компаратор, який містить зворотний порядок наданого компаратора.
статичнийКомпаратор reverseOrder()Він повертає компаратор, який містить зворотне до природного порядку.
Типовий компаратор thenComparing (інший компаратор)Він повертає компаратор лексикографічного порядку з іншим компаратором.
за замовчуваннямComparator thenComparing(Function keyExtractor)Він повертає компаратор лексикографічного порядку з функцією, яка витягує ключ сортування Comparable.
Comparator за замовчуванням thenComparing(Function keyExtractor, Comparator keyComparator)Він повертає компаратор лексикографічного порядку з функцією, яка виділяє ключ для порівняння з заданим компаратором.
Типовий компаратор thenComparingDouble(ToDoubleFunction keyExtractor)Він повертає компаратор лексикографічного порядку з функцією, яка витягує ключ подвійного сортування.
Типовий компаратор thenComparingInt(ToIntFunction keyExtractor)Він повертає компаратор лексикографічного порядку з функцією, яка витягує ключ сортування int.
Типовий компаратор thenComparingLong(ToLongFunction keyExtractor)Він повертає компаратор лексикографічного порядку з функцією, яка витягує довгий ключ сортування.

Приклад компаратора Java 8

Розглянемо приклад сортування елементів List за віком та іменем.

Файл: Student.java

 class Student { int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } public int getRollno() { return rollno; } public void setRollno(int rollno) { this.rollno = rollno; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 

Файл: TestSort1.java

 import java.util.*; public class TestSort1{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); //Sorting elements on the basis of name Comparator cm1=Comparator.comparing(Student::getName); Collections.sort(al,cm1); System.out.println('Sorting by Name'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } //Sorting elements on the basis of age Comparator cm2=Comparator.comparing(Student::getAge); Collections.sort(al,cm2); System.out.println('Sorting by Age'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by Age 105 Jai 21 101 Vijay 23 106 Ajay 27 

Приклад компаратора Java 8: метод nullsFirst() і nullsLast().

Тут ми сортуємо список елементів, які також містять значення null.

Файл: Student.java

 class Student { int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } public int getRollno() { return rollno; } public void setRollno(int rollno) { this.rollno = rollno; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 

Файл: TestSort2.java

 import java.util.*; public class TestSort2{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,null,21)); Comparator cm1=Comparator.comparing(Student::getName,Comparator.nullsFirst(String::compareTo)); Collections.sort(al,cm1); System.out.println('Considers null to be less than non-null'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } Comparator cm2=Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)); Collections.sort(al,cm2); System.out.println('Considers null to be greater than non-null'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Considers null to be less than non-null 105 null 21 106 Ajay 27 101 Vijay 23 Considers null to be greater than non-null 106 Ajay 27 101 Vijay 23 105 null 21