logo

Java Comparator interface

Java Comparator interface bruges til at bestille objekterne i en brugerdefineret klasse.

Denne grænseflade findes i pakken java.util og indeholder 2 metoder compare(Object obj1,Object obj2) og equals(Object element).

Det giver flere sorteringssekvenser, dvs. du kan sortere elementerne på basis af ethvert datamedlem, for eksempel rollno, navn, alder eller noget andet.

Metoder til Java Comparator Interface

MetodeBeskrivelse
public int compare(Object obj1, Object obj2)Den sammenligner det første objekt med det andet objekt.
offentlig boolesk lig (Object obj)Det bruges til at sammenligne det aktuelle objekt med det angivne objekt.
offentlig boolesk lig (Object obj)Det bruges til at sammenligne det aktuelle objekt med det angivne objekt.

Samlinger klasse

Samlinger klasse giver statiske metoder til at sortere elementerne i en samling. Hvis samlingselementer er af Set eller Map, kan vi bruge TreeSet eller TreeMap. Vi kan dog ikke sortere elementerne i List. Collections-klassen giver også metoder til at sortere elementerne i Liste-elementer.

Metode for samlinger klasse til sortering af listeelementer

public void sort(listeliste, komparator c): bruges til at sortere elementerne i List efter den givne komparator.


Eksempel på Java-sammenligning (ikke-generisk gammel stil)

Lad os se eksemplet med at sortere elementerne i List på basis af alder og navn. I dette eksempel har vi lavet 4 java klasser:

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

Denne klasse indeholder tre felter rollno, navn og alder og en parameteriseret konstruktør.

 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

Denne klasse definerer sammenligningslogik baseret på alderen. Hvis det første objekts alder er større end det andet, returnerer vi en positiv værdi. Det kan være enhver som f.eks. 1, 2, 10. Hvis alderen på det første objekt er mindre end det andet objekt, returnerer vi en negativ værdi, det kan være en hvilken som helst negativ værdi, og hvis alderen på begge objekter er ens, vi returnerer 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

Denne klasse giver sammenligningslogik baseret på navnet. I sådanne tilfælde bruger vi compareTo()-metoden i String-klassen, som internt leverer sammenligningslogikken.

 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

I denne klasse udskriver vi objektets værdier ved at sortere efter navn og alder.

 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 

Eksempel på Java-sammenligning (generisk)

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

Denne klasse giver sammenligningslogik baseret på navnet. I sådanne tilfælde bruger vi compareTo()-metoden i String-klassen, som internt leverer sammenligningslogikken.

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

I denne klasse udskriver vi objektets værdier ved at sortere efter navn og alder.

 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 interface

Java 8 Comparator-grænseflade er en funktionel grænseflade, der kun indeholder én abstrakt metode. Nu kan vi bruge Comparator-grænsefladen som tildelingsmål for et lambda-udtryk eller en metodereference.

Metoder til Java 8 Comparator Interface

MetodeBeskrivelse
int sammenligne(T o1, T o2)Den sammenligner det første objekt med det andet objekt.
statiskKomparatorsammenligning (Funktionstastudtrækker)Den accepterer en funktion, der uddrager en sammenlignelig sorteringsnøgle fra en type T, og returnerer en komparator, der sammenligner med den sorteringsnøgle.
statisk komparatorsammenligning(FunktionstastExtractor, ComparatorkeyComparator)Den accepterer en funktion, der uddrager en sorteringsnøgle fra en type T, og returnerer en komparator, der sammenligner med den sorteringsnøgle ved hjælp af den angivne komparator.
static Comparator comparingDouble(ToDoubleFunction keyExtractor)Den accepterer en funktion, der uddrager en dobbeltsorteringsnøgle fra en type T, og returnerer en komparator, der sammenligner med denne sorteringsnøgle.
statisk Comparator comparingInt(ToIntFunction keyExtractor)Den accepterer en funktion, der uddrager en int-sorteringsnøgle fra en type T, og returnerer en komparator, der sammenligner med den sorteringsnøgle.
statisk komparator sammenlignerLang(ToLongFunction keyExtractor)Den accepterer en funktion, der uddrager en lang sorteringsnøgle fra en type T, og returnerer en komparator, der sammenligner med den sorteringsnøgle.
boolesk lig (Objekt obj)Det bruges til at sammenligne det aktuelle objekt med det angivne objekt.
statiskComparator naturalOrder()Det returnerer en komparator, der sammenligner sammenlignelige objekter i naturlig rækkefølge.
static Comparator nullsFirst(Comparator comparator)Det returnerer en komparator, der behandler nul til at være mindre end ikke-nul elementer.
static Comparator nullsLast(Comparator komparator)Det returnerer en komparator, der behandler nul til at være større end ikke-nul elementer.
standard komparator omvendt()Den returnerer komparator, der indeholder omvendt rækkefølge af den leverede komparator.
statiskKomparator reverseOrder()Det returnerer komparator, der indeholder omvendt af naturlig rækkefølge.
default Comparator thenComparing(Comparator other)Det returnerer en komparator i leksikografisk orden med en anden komparator.
StandardComparator thenComparing(Function keyExtractor)Det returnerer en komparator med leksikografisk orden med en funktion, der uddrager en sammenlignelig sorteringsnøgle.
standard Comparator thenComparing(Function keyExtractor, Comparator keyComparator)Den returnerer en komparator i leksikografisk orden med en funktion, der uddrager en nøgle, der skal sammenlignes med den givne komparator.
standard Comparator thenComparingDouble(ToDoubleFunction keyExtractor)Det returnerer en leksikografisk rækkefølge-komparator med en funktion, der uddrager en dobbeltsorteringsnøgle.
standard Comparator thenComparingInt(ToIntFunction keyExtractor)Det returnerer en leksikografisk rækkefølge-komparator med en funktion, der uddrager en int-sorteringsnøgle.
standard Comparator thenComparingLong(ToLongFunction keyExtractor)Det returnerer en leksikografisk rækkefølge-komparator med en funktion, der uddrager en lang sorteringsnøgle.

Java 8 komparator eksempel

Lad os se eksemplet med at sortere elementerne i List på basis af alder og navn.

Fil: 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; } } 

Fil: 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 Comparator Eksempel: nullsFirst() og nullsLast() metode

Her sorterer vi listen over elementer, der også indeholder null.

Fil: 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; } } 

Fil: 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