logo

Interfață Java Comparator

Interfață Java Comparator este folosit pentru a ordona obiectele unei clase definite de utilizator.

Această interfață se găsește în pachetul java.util și conține 2 metode compare (Object obj1, Object obj2) și equals (Object element).

Oferă mai multe secvențe de sortare, adică puteți sorta elementele pe baza oricărui membru al datelor, de exemplu, rollno, nume, vârstă sau orice altceva.

Metode ale interfeței de comparare Java

MetodăDescriere
public int compară (Obiect obj1, Object obj2)Compară primul obiect cu al doilea obiect.
public boolean equals(Object object)Este folosit pentru a compara obiectul curent cu obiectul specificat.
public boolean equals(Object object)Este folosit pentru a compara obiectul curent cu obiectul specificat.

Clasa de colecții

Colecții class oferă metode statice de sortare a elementelor unei colecții. Dacă elementele de colecție sunt Set sau Map, putem folosi TreeSet sau TreeMap. Cu toate acestea, nu putem sorta elementele List. Clasa Colecții oferă și metode de sortare a elementelor de tip Listă.

Metoda clasei Collections pentru sortarea elementelor List

public void sort (listă listă, comparator c): este folosit pentru a sorta elementele Listă după comparatorul dat.


Exemplu de comparator Java (stil vechi negeneric)

Să vedem exemplul de sortare a elementelor Listă pe baza vârstei și numelui. În acest exemplu, am creat 4 clase java:

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

Această clasă conține trei câmpuri rollno, nume și vârstă și un constructor parametrizat.

 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

Această clasă definește logica de comparație în funcție de vârstă. Dacă vârsta primului obiect este mai mare decât a celui de-al doilea, returnăm o valoare pozitivă. Poate fi oricine, cum ar fi 1, 2, 10. Dacă vârsta primului obiect este mai mică decât a celui de-al doilea obiect, returnăm o valoare negativă, poate fi orice valoare negativă, iar dacă vârsta ambelor obiecte este egală, ne intoarcem 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

Această clasă oferă o logică de comparare bazată pe nume. În acest caz, folosim metoda compareTo() a clasei String, care furnizează intern logica de comparare.

 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); } } 
Simplu.java

În această clasă, imprimăm valorile obiectului prin sortare în funcție de nume și vârstă.

 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 

Exemplu de comparator Java (generic)

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

Această clasă oferă o logică de comparare bazată pe nume. În acest caz, folosim metoda compareTo() a clasei String, care furnizează intern logica de comparare.

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

În această clasă, imprimăm valorile obiectului prin sortare în funcție de nume și vârstă.

 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 

Interfață Java 8 Comparator

Interfața Java 8 Comparator este o interfață funcțională care conține o singură metodă abstractă. Acum, putem folosi interfața Comparator ca țintă de atribuire pentru o expresie lambda sau o referință de metodă.

Metode ale interfeței de comparație Java 8

MetodăDescriere
int compara(T o1, T o2)Compară primul obiect cu al doilea obiect.
staticComparator comparator (Function keyExtractor)Acceptă o funcție care extrage o cheie de sortare comparabilă dintr-un tip T și returnează un comparator care compară după acea cheie de sortare.
Comparator static comparator (Extractor de taste funcționale, Comparator de taste de comparație)Acceptă o funcție care extrage o cheie de sortare dintr-un tip T și returnează un Comparator care compară după acea cheie de sortare folosind Comparatorul specificat.
Comparator static comparingDouble(ToDoubleFunction keyExtractor)Acceptă o funcție care extrage o cheie de sortare dublă dintr-un tip T și returnează un Comparator care compară după acea cheie de sortare.
Comparator static comparingInt(ToIntFunction keyExtractor)Acceptă o funcție care extrage o cheie de sortare int dintr-un tip T și returnează un Comparator care compară cu acea cheie de sortare.
Comparator static comparingLong(ToLongFunction keyExtractor)Acceptă o funcție care extrage o cheie de sortare lungă dintr-un tip T și returnează un Comparator care compară după acea cheie de sortare.
boolean este egal(obiect obiect)Este folosit pentru a compara obiectul curent cu obiectul specificat.
staticComparator naturalOrder()Returnează un comparator care compară obiecte comparabile în ordine naturală.
static Comparator nullsFirst(Comparator comparator)Returnează un comparator care tratează nul ca fiind mai mic decât elementele non-null.
static Comparator nullsLast(Comparator comparator)Returnează un comparator care tratează nul ca fiind mai mare decât elementele non-null.
implicit Comparator inversat()Returnează comparatorul care conține ordinea inversă a comparatorului furnizat.
staticComparator reverseOrder()Returnează un comparator care conține inversul ordinii naturale.
implicit Comparator apoi Comparing (Comparator altul)Returnează un comparator de ordine lexicografică cu un alt comparator.
Mod implicitComparator apoi Comparare (Tasta funcționalăExtractor)Returnează un comparator de ordine lexicografică cu o funcție care extrage o cheie de sortare comparabilă.
Comparator implicit, apoi Comparare (Tasta funcționalăExtractor, Comparator cheie Comparator)Returnează un comparator de ordine lexicografică cu o funcție care extrage o cheie pentru a fi comparată cu Comparatorul dat.
Comparator implicit apoi ComparingDouble(ToDoubleFunction keyExtractor)Returnează un comparator de ordine lexicografică cu o funcție care extrage o cheie de sortare dublă.
implicit Comparator thenComparingInt(ToIntFunction keyExtractor)Returnează un comparator de ordine lexicografică cu o funcție care extrage o cheie de sortare int.
Comparator implicit apoi ComparingLong(ToLongFunction keyExtractor)Returnează un comparator de ordine lexicografică cu o funcție care extrage o cheie de sortare lungă.

Exemplu de comparator Java 8

Să vedem exemplul de sortare a elementelor Listă pe baza vârstei și numelui.

Fișier: 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; } } 

Fișier: 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 

Exemplu comparator Java 8: metoda nullsFirst() și nullsLast().

Aici, sortăm lista de elemente care conține și null.

Fișier: 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; } } 

Fișier: 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