logo

Java Comparator-Schnittstelle

Java Comparator-Schnittstelle wird verwendet, um die Objekte einer benutzerdefinierten Klasse zu ordnen.

Diese Schnittstelle befindet sich im Paket java.util und enthält die beiden Methoden „compare“ (Object obj1, Object obj2) und „equals“ (Object element).

Es bietet mehrere Sortierreihenfolgen, d. h. Sie können die Elemente auf der Grundlage eines beliebigen Datenelements sortieren, zum Beispiel nach Rollennummer, Name, Alter oder irgendetwas anderem.

Methoden der Java-Komparatorschnittstelle

MethodeBeschreibung
public int vergleichen (Objekt obj1, Objekt obj2)Es vergleicht das erste Objekt mit dem zweiten Objekt.
öffentlicher boolescher Wert gleicht (Objekt obj)Es wird verwendet, um das aktuelle Objekt mit dem angegebenen Objekt zu vergleichen.
öffentlicher boolescher Wert gleicht (Objekt obj)Es wird verwendet, um das aktuelle Objekt mit dem angegebenen Objekt zu vergleichen.

Klasse Sammlungen

Sammlungen Die Klasse stellt statische Methoden zum Sortieren der Elemente einer Sammlung bereit. Wenn Sammlungselemente vom Typ Set oder Map sind, können wir TreeSet oder TreeMap verwenden. Allerdings können wir die Elemente der Liste nicht sortieren. Die Collections-Klasse stellt auch Methoden zum Sortieren der Elemente von Listentypelementen bereit.

Methode der Collections-Klasse zum Sortieren von Listenelementen

public void sort(Listenliste, Komparator c): wird verwendet, um die Elemente der Liste nach dem angegebenen Komparator zu sortieren.


Beispiel für einen Java-Komparator (nicht generischer alter Stil)

Sehen wir uns das Beispiel der Sortierung der Elemente von List nach Alter und Name an. In diesem Beispiel haben wir 4 Java-Klassen erstellt:

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

Diese Klasse enthält drei Felder rollno, name und age sowie einen parametrisierten 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

Diese Klasse definiert eine Vergleichslogik basierend auf dem Alter. Wenn das Alter des ersten Objekts größer als das des zweiten ist, geben wir einen positiven Wert zurück. Es kann irgendein Wert sein, beispielsweise 1, 2, 10. Wenn das Alter des ersten Objekts kleiner als das des zweiten Objekts ist, geben wir einen negativen Wert zurück. Es kann jeder negative Wert sein, und wenn das Alter beider Objekte gleich ist, wir geben 0 zurück.

 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

Diese Klasse stellt eine Vergleichslogik basierend auf dem Namen bereit. In diesem Fall verwenden wir die Methode „compareTo()“ der Klasse „String“, die intern die Vergleichslogik bereitstellt.

 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

In dieser Klasse drucken wir die Werte des Objekts aus, indem wir sie nach Name und Alter sortieren.

 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 

Beispiel für einen Java-Komparator (allgemein)

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

Diese Klasse stellt eine Vergleichslogik basierend auf dem Namen bereit. In diesem Fall verwenden wir die Methode „compareTo()“ der Klasse „String“, die intern die Vergleichslogik bereitstellt.

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

In dieser Klasse drucken wir die Werte des Objekts aus, indem wir sie nach Name und Alter sortieren.

 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-Schnittstelle

Die Java 8 Comparator-Schnittstelle ist eine funktionale Schnittstelle, die nur eine abstrakte Methode enthält. Jetzt können wir die Comparator-Schnittstelle als Zuweisungsziel für einen Lambda-Ausdruck oder eine Methodenreferenz verwenden.

Methoden der Java 8-Komparatorschnittstelle

MethodeBeschreibung
int vergleichen(T o1, T o2)Es vergleicht das erste Objekt mit dem zweiten Objekt.
statischKomparatorvergleich (Funktion keyExtractor)Es akzeptiert eine Funktion, die einen Comparable-Sortierschlüssel aus einem Typ T extrahiert, und gibt einen Komparator zurück, der anhand dieses Sortierschlüssels vergleicht.
statischer Komparatorvergleich (Funktion keyExtractor, Komparator keyComparator)Es akzeptiert eine Funktion, die einen Sortierschlüssel aus einem Typ T extrahiert, und gibt einen Komparator zurück, der anhand dieses Sortierschlüssels unter Verwendung des angegebenen Komparators vergleicht.
statischer Komparator vergleichenDouble(ToDoubleFunction keyExtractor)Es akzeptiert eine Funktion, die einen doppelten Sortierschlüssel aus einem Typ T extrahiert, und gibt einen Komparator zurück, der anhand dieses Sortierschlüssels vergleicht.
statischer Komparator vergleichenInt(ToIntFunction keyExtractor)Es akzeptiert eine Funktion, die einen int-Sortierschlüssel aus einem Typ T extrahiert, und gibt einen Komparator zurück, der anhand dieses Sortierschlüssels vergleicht.
statischer Komparator vergleichenLong(ToLongFunction keyExtractor)Es akzeptiert eine Funktion, die einen langen Sortierschlüssel aus einem Typ T extrahiert, und gibt einen Komparator zurück, der anhand dieses Sortierschlüssels vergleicht.
boolean equals(Object obj)Es wird verwendet, um das aktuelle Objekt mit dem angegebenen Objekt zu vergleichen.
statischKomparator naturalOrder()Es gibt einen Komparator zurück, der vergleichbare Objekte in natürlicher Reihenfolge vergleicht.
statischer Komparator nullsFirst(Komparator Komparator)Es gibt einen Komparator zurück, der Null als weniger als Nicht-Null-Elemente behandelt.
statischer Komparator nullsLast(Komparator Komparator)Es gibt einen Komparator zurück, der Null als größer als Nicht-Null-Elemente behandelt.
Standardkomparator umgekehrt()Es gibt einen Komparator zurück, der die umgekehrte Reihenfolge des bereitgestellten Komparators enthält.
statischKomparator reverseOrder()Es gibt einen Komparator zurück, der die Umkehrung der natürlichen Reihenfolge enthält.
Standardkomparator thenComparing (Komparator andere)Es gibt einen Komparator der lexikografischen Reihenfolge mit einem anderen Komparator zurück.
StandardKomparator thenComparing(Funktion keyExtractor)Es gibt einen lexikografischen Ordnungskomparator mit einer Funktion zurück, die einen vergleichbaren Sortierschlüssel extrahiert.
Standardkomparator thenComparing (Funktion keyExtractor, Komparator keyComparator)Es gibt einen Komparator lexikografischer Ordnung mit einer Funktion zurück, die einen Schlüssel extrahiert, der mit dem angegebenen Komparator verglichen werden soll.
Standardkomparator thenComparingDouble(ToDoubleFunction keyExtractor)Es gibt einen lexikografischen Ordnungskomparator mit einer Funktion zurück, die einen doppelten Sortierschlüssel extrahiert.
Standardkomparator thenComparingInt(ToIntFunction keyExtractor)Es gibt einen lexikografischen Ordnungskomparator mit einer Funktion zurück, die einen int-Sortierschlüssel extrahiert.
Standardkomparator thenComparingLong(ToLongFunction keyExtractor)Es gibt einen lexikografischen Ordnungskomparator mit einer Funktion zurück, die einen langen Sortierschlüssel extrahiert.

Beispiel für einen Java 8-Komparator

Sehen wir uns das Beispiel der Sortierung der Elemente von List nach Alter und Name an.

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

Datei: 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-Komparator-Beispiel: nullsFirst()- und nullsLast()-Methode

Hier sortieren wir die Liste der Elemente, die auch Null enthalten.

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

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