logo

Java Comparator-gränssnitt

Java Comparator-gränssnitt används för att ordna objekten i en användardefinierad klass.

Detta gränssnitt finns i paketet java.util och innehåller 2 metoder compare(Object obj1,Object obj2) och equals(Object element).

Det tillhandahåller flera sorteringssekvenser, det vill säga du kan sortera elementen på basis av vilken datamedlem som helst, till exempel rollno, namn, ålder eller något annat.

Metoder för Java Comparator Interface

MetodBeskrivning
public int compare(Object obj1, Object obj2)Den jämför det första objektet med det andra objektet.
offentlig boolesk lika med(Object obj)Den används för att jämföra det aktuella objektet med det angivna objektet.
offentlig boolesk lika med(Object obj)Den används för att jämföra det aktuella objektet med det angivna objektet.

Samlingsklass

Samlingar class tillhandahåller statiska metoder för att sortera elementen i en samling. Om samlingselement är av Set eller Map kan vi använda TreeSet eller TreeMap. Men vi kan inte sortera elementen i List. Collections class tillhandahåller metoder för att sortera elementen i listtypelement också.

Metod för samlingsklass för sortering av listelement

public void sort(List list, Comparator c): används för att sortera elementen i List efter den givna komparatorn.


Java Comparator Exempel (icke-generisk gammal stil)

Låt oss se exemplet med att sortera elementen i List på basis av ålder och namn. I det här exemplet har vi skapat 4 java-klasser:

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

Denna klass innehåller tre fält rollno, namn och ålder och en parametriserad konstruktor.

 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

Denna klass definierar jämförelselogik baserat på åldern. Om det första objektets ålder är högre än det andra returnerar vi ett positivt värde. Det kan vara vem som helst som 1, 2, 10. Om åldern på det första objektet är mindre än det andra objektet returnerar vi ett negativt värde, det kan vara vilket negativt värde som helst, och om åldern på båda objekten är lika, vi returnerar 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

Denna klass tillhandahåller jämförelselogik baserad på namnet. I sådana fall använder vi metoden compareTo() för klassen String, som internt tillhandahåller jämförelselogiken.

 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 den här klassen skriver vi ut objektets värden genom att sortera efter namn och ålder.

 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 Comparator Exempel (Allmänt)

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

Denna klass tillhandahåller jämförelselogik baserad på namnet. I sådana fall använder vi metoden compareTo() för klassen String, som internt tillhandahåller jämförelselogiken.

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

I den här klassen skriver vi ut objektets värden genom att sortera efter namn och ålder.

 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-gränssnitt

Java 8 Comparator-gränssnitt är ett funktionellt gränssnitt som bara innehåller en abstrakt metod. Nu kan vi använda Comparator-gränssnittet som tilldelningsmål för ett lambda-uttryck eller metodreferens.

Metoder för Java 8 Comparator Interface

MetodBeskrivning
int compare(T o1, T o2)Den jämför det första objektet med det andra objektet.
statiskComparator comparing(Function keyExtractor)Den accepterar en funktion som extraherar en jämförbar sorteringsnyckel från en typ T och returnerar en komparator som jämför med den sorteringsnyckeln.
statisk Comparator comparing (FunktionsnyckelExtractor, Comparator KeyComparator)Den accepterar en funktion som extraherar en sorteringsnyckel från en typ T och returnerar en komparator som jämför med den sorteringsnyckeln med den angivna komparatorn.
static Comparator comparingDouble(ToDoubleFunction keyExtractor)Den accepterar en funktion som extraherar en dubbelsorteringsnyckel från en typ T och returnerar en Comparator som jämför med den sorteringsnyckeln.
static Comparator comparingInt(ToIntFunction keyExtractor)Den accepterar en funktion som extraherar en int-sorteringsnyckel från en typ T och returnerar en Comparator som jämför med den sorteringsnyckeln.
static Comparator comparingLong(ToLongFunction keyExtractor)Den accepterar en funktion som extraherar en lång sorteringsnyckel från en typ T och returnerar en komparator som jämför med den sorteringsnyckeln.
boolesk lika med(Objekt obj)Den används för att jämföra det aktuella objektet med det angivna objektet.
statiskComparator naturalOrder()Den returnerar en komparator som jämför jämförbara objekt i naturlig ordning.
static Comparator nullsFirst(Comparator comparator)Den returnerar en komparator som behandlar att null är mindre än icke-nullelement.
static Comparator nullsLast(Comparator comparator)Den returnerar en komparator som behandlar null för att vara större än icke-nullelement.
default Comparator reversed()Den returnerar komparator som innehåller omvänd ordning av den medföljande komparatorn.
statiskKomparator reverseOrder()Den returnerar komparator som innehåller omvänd naturlig ordning.
default Comparator thenComparing(Comparator other)Den returnerar en komparator av lexikografisk ordning med en annan komparator.
standardComparator thenComparing(Function keyExtractor)Den returnerar en komparator med lexikografisk ordning med en funktion som extraherar en jämförbar sorteringsnyckel.
standard Comparator thenComparing(Function keyExtractor, Comparator keyComparator)Den returnerar en komparator av lexikografisk ordning med en funktion som extraherar en nyckel som ska jämföras med den givna komparatorn.
standard Comparator thenComparingDouble(ToDoubleFunction keyExtractor)Den returnerar en lexikografisk ordningskomparator med en funktion som extraherar en dubbelsorteringsnyckel.
standard Comparator thenComparingInt(ToIntFunction keyExtractor)Den returnerar en komparator med lexikografisk ordning med en funktion som extraherar en int sort-nyckel.
standard Comparator thenComparingLong(ToLongFunction keyExtractor)Den returnerar en lexikografisk ordningskomparator med en funktion som extraherar en lång sorteringsnyckel.

Java 8 Comparator Exempel

Låt oss se exemplet med att sortera elementen i List på basis av ålder och namn.

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 Exempel: metoden nullsFirst() och nullsLast().

Här sorterar vi listan med element som också innehåller 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