logo

Интерфейс на Java Comparator

Интерфейс на Java Comparator се използва за подреждане на обектите на дефиниран от потребителя клас.

Този интерфейс се намира в пакета java.util и съдържа 2 метода compare(Object obj1,Object obj2) и equals(Object element).

Той предоставя множество последователности за сортиране, т.е. можете да сортирате елементите на базата на всеки член от данни, например rollno, име, възраст или нещо друго.

Методи на Java Comparator Interface

МетодОписание
public int compare(Object obj1, Object obj2)Той сравнява първия обект с втория обект.
публичен булев е равен (Object obj)Използва се за сравняване на текущия обект с посочения обект.
публичен булев е равен (Object obj)Използва се за сравняване на текущия обект с посочения обект.

Колекции клас

Колекции предоставя статични методи за сортиране на елементите на колекция. Ако елементите на колекцията са от Set или Map, можем да използваме TreeSet или TreeMap. Не можем обаче да сортираме елементите на List. Класът Collections също предоставя методи за сортиране на елементите от тип List.

Метод на клас Collections за сортиране на елементи от List

обществено невалидно сортиране (Списък, Comparator c): се използва за сортиране на елементите на List по даден Comparator.


Пример за сравнение на Java (негенеричен стар стил)

Нека видим примера за сортиране на елементите на List въз основа на възраст и име. В този пример създадохме 4 Java класа:

  1. Студент.java
  2. AgeComparator.java
  3. NameComparator.java
  4. Simple.java
Студент.java

Този клас съдържа три полета rollno, име и възраст и параметризиран конструктор.

 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 (генеричен)

Студент.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

Интерфейсът на Java 8 Comparator е функционален интерфейс, който съдържа само един абстрактен метод. Сега можем да използваме интерфейса на Comparator като цел за присвояване на ламбда израз или препратка към метод.

Методи на интерфейса за сравнение на Java 8

МетодОписание
int compare(T o1, T o2)Той сравнява първия обект с втория обект.
статиченСравняване на компаратор (функционален ключExtractor)Той приема функция, която извлича ключ за сортиране Comparable от тип T и връща Comparator, който сравнява по този ключ за сортиране.
сравняване на статичен компаратор (функционален ключExtractor, компараторен ключComparator)Той приема функция, която извлича ключ за сортиране от тип T и връща Comparator, който сравнява по този ключ за сортиране, използвайки посочения Comparator.
статичен компаратор comparingDouble(ToDoubleFunction keyExtractor)Той приема функция, която извлича двоен ключ за сортиране от тип T и връща Comparator, който сравнява по този ключ за сортиране.
статичен компаратор comparingInt(ToIntFunction keyExtractor)Той приема функция, която извлича int ключ за сортиране от тип T и връща Comparator, който сравнява по този ключ за сортиране.
статичен компаратор comparingLong(ToLongFunction keyExtractor)Той приема функция, която извлича дълъг ключ за сортиране от тип T и връща Comparator, който сравнява по този ключ за сортиране.
булево равно (Object obj)Използва се за сравняване на текущия обект с посочения обект.
статиченComparator naturalOrder()Той връща компаратор, който сравнява сравними обекти в естествен ред.
статичен компаратор nullsFirst(компаратор за сравнение)Той връща компаратор, който третира null като по-малко от ненулевите елементи.
статичен Comparator nullsLast(Comparator comparator)Той връща компаратор, който третира null като по-голям от не-null елементи.
Comparator по подразбиране обърнат()Връща компаратор, който съдържа обратен ред на предоставения компаратор.
статиченComparator reverseOrder()Връща компаратор, който съдържа обратен на естествения ред.
Comparator по подразбиране thenComparing (Comparator other)Той връща компаратор за лексикографски ред с друг компаратор.
по подразбиранеComparator thenComparing(Function keyExtractor)Той връща компаратор за лексикографски ред с функция, която извлича ключ за сортиране на Comparable.
Comparator по подразбиране thenComparing(Function keyExtractor, Comparator keyComparator)Той връща компаратор на лексикографски ред с функция, която извлича ключ за сравнение с дадения компаратор.
Comparator по подразбиране thenComparingDouble(ToDoubleFunction keyExtractor)Той връща компаратор за лексикографски ред с функция, която извлича ключ за двойно сортиране.
Comparator по подразбиране thenComparingInt(ToIntFunction keyExtractor)Той връща компаратор за лексикографски ред с функция, която извлича int ключ за сортиране.
Comparator по подразбиране 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