logo

Interfaccia comparatore Java

Interfaccia comparatore Java viene utilizzato per ordinare gli oggetti di una classe definita dall'utente.

Questa interfaccia si trova nel pacchetto java.util e contiene 2 metodi compare (oggetto obj1, oggetto obj2) ed equals (elemento oggetto).

Fornisce più sequenze di ordinamento, ovvero è possibile ordinare gli elementi sulla base di qualsiasi membro dei dati, ad esempio rollno, nome, età o qualsiasi altra cosa.

Metodi dell'interfaccia del comparatore Java

MetodoDescrizione
public int compare(Oggetto obj1, Oggetto obj2)Confronta il primo oggetto con il secondo oggetto.
booleano pubblico è uguale a (Oggetto oggetto)Viene utilizzato per confrontare l'oggetto corrente con l'oggetto specificato.
booleano pubblico è uguale a (Oggetto oggetto)Viene utilizzato per confrontare l'oggetto corrente con l'oggetto specificato.

Classe di collezioni

Collezioni La classe fornisce metodi statici per ordinare gli elementi di una raccolta. Se gli elementi della raccolta sono Set o Map, possiamo utilizzare TreeSet o TreeMap. Tuttavia, non possiamo ordinare gli elementi di List. La classe Collections fornisce metodi per ordinare anche gli elementi di tipo List.

Metodo della classe Collections per l'ordinamento degli elementi dell'elenco

public void sort(Lista elenco, Comparatore c): viene utilizzato per ordinare gli elementi di List in base al comparatore specificato.


Esempio di comparatore Java (vecchio stile non generico)

Vediamo l'esempio di ordinamento degli elementi di List in base all'età e al nome. In questo esempio, abbiamo creato 4 classi Java:

  1. Student.java
  2. AgeComparator.java
  3. NomeComparator.java
  4. Semplice.java
Student.java

Questa classe contiene tre campi rollno, name ed age e un costruttore parametrizzato.

 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

Questa classe definisce la logica di confronto in base all'età. Se l'età del primo oggetto è maggiore del secondo, stiamo restituendo un valore positivo. Può essere chiunque, ad esempio 1, 2, 10. Se l'età del primo oggetto è inferiore a quella del secondo oggetto, stiamo restituendo un valore negativo, può essere qualsiasi valore negativo e se l'età di entrambi gli oggetti è uguale, stiamo restituendo 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; } } 
NomeComparator.java

Questa classe fornisce la logica di confronto basata sul nome. In tal caso, stiamo utilizzando il metodo compareTo() della classe String, che fornisce internamente la logica di confronto.

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

In questa classe stampiamo i valori dell'oggetto ordinandoli in base al nome e all'età.

 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 

Esempio di comparatore Java (generico)

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

Questa classe fornisce la logica di confronto basata sul nome. In tal caso, stiamo utilizzando il metodo compareTo() della classe String, che fornisce internamente la logica di confronto.

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

In questa classe stampiamo i valori dell'oggetto ordinandoli in base al nome e all'età.

 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 

Interfaccia comparatore Java 8

L'interfaccia Java 8 Comparator è un'interfaccia funzionale che contiene solo un metodo astratto. Ora possiamo utilizzare l'interfaccia Comparator come destinazione dell'assegnazione per un'espressione lambda o un riferimento al metodo.

Metodi dell'interfaccia del comparatore Java 8

MetodoDescrizione
int confronta(T o1, T o2)Confronta il primo oggetto con il secondo oggetto.
staticoConfronto comparatore (Tasto funzione Estrattore)Accetta una funzione che estrae una chiave di ordinamento comparabile da un tipo T e restituisce un comparatore che confronta in base a quella chiave di ordinamento.
Confronto comparatore statico (Funzione keyExtractor, Comparator keyComparator)Accetta una funzione che estrae una chiave di ordinamento da un tipo T e restituisce un comparatore che confronta in base a tale chiave di ordinamento utilizzando il comparatore specificato.
Comparatore statico comparendoDouble(ToDoubleFunction keyExtractor)Accetta una funzione che estrae una doppia chiave di ordinamento da un tipo T e restituisce un comparatore che confronta in base a quella chiave di ordinamento.
Comparatore statico comparendoInt(ToIntFunction keyExtractor)Accetta una funzione che estrae una chiave di ordinamento int da un tipo T e restituisce un comparatore che confronta in base a quella chiave di ordinamento.
Comparatore statico che confrontaLong(ToLongFunction keyExtractor)Accetta una funzione che estrae una chiave di ordinamento lunga da un tipo T e restituisce un comparatore che confronta in base a quella chiave di ordinamento.
booleano è uguale a(Oggetto oggetto)Viene utilizzato per confrontare l'oggetto corrente con l'oggetto specificato.
staticoComparatore ordinenaturale()Restituisce un comparatore che confronta oggetti comparabili in ordine naturale.
Comparatore statico nullsFirst(Comparatore comparatore)Restituisce un comparatore che considera null come inferiore agli elementi non null.
Comparatore statico nullsLast(Comparatore comparatore)Restituisce un comparatore che considera null come maggiore degli elementi non null.
comparatore predefinito invertito()Restituisce un comparatore che contiene l'ordine inverso del comparatore fornito.
staticoComparatore ordine inverso()Restituisce un comparatore che contiene l'inverso dell'ordinamento naturale.
Comparatore predefinito quindiConfronto(Comparatore altro)Restituisce un comparatore di ordine lessicografico con un altro comparatore.
predefinitoComparatore quindi Confronto (Estrattore tasto funzione)Restituisce un comparatore di ordine lessicografico con una funzione che estrae una chiave di ordinamento comparabile.
comparatore predefinito thenComparing(Funzione keyExtractor, Comparator keyComparator)Restituisce un comparatore di ordine lessicografico con una funzione che estrae una chiave da confrontare con il comparatore specificato.
comparatore predefinito thenComparingDouble(ToDoubleFunction keyExtractor)Restituisce un comparatore di ordine lessicografico con una funzione che estrae una doppia chiave di ordinamento.
comparatore predefinito thenComparingInt(ToIntFunction keyExtractor)Restituisce un comparatore di ordine lessicografico con una funzione che estrae una chiave di ordinamento int.
comparatore predefinito thenComparingLong(ToLongFunction keyExtractor)Restituisce un comparatore di ordine lessicografico con una funzione che estrae una chiave di ordinamento lunga.

Esempio di comparatore Java 8

Vediamo l'esempio di ordinamento degli elementi di List in base all'età e al nome.

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

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

Esempio di comparatore Java 8: metodo nullsFirst() e nullsLast()

Qui ordiniamo l'elenco di elementi che contengono anche null.

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

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