logo

Interface du comparateur Java

Interface du comparateur Java est utilisé pour classer les objets d'une classe définie par l'utilisateur.

Cette interface se trouve dans le package java.util et contient 2 méthodes compare (Object obj1, Object obj2) et equals (Object element).

Il fournit plusieurs séquences de tri, c'est-à-dire que vous pouvez trier les éléments en fonction de n'importe quelle donnée membre, par exemple le numéro de rôle, le nom, l'âge ou toute autre chose.

Méthodes de l'interface de comparaison Java

MéthodeDescription
public int comparer (Objet obj1, Objet obj2)Il compare le premier objet avec le deuxième objet.
public booléen égal (Objet obj)Il est utilisé pour comparer l'objet actuel avec l'objet spécifié.
public booléen égal (Objet obj)Il est utilisé pour comparer l'objet actuel avec l'objet spécifié.

Classe de collections

Collections class fournit des méthodes statiques pour trier les éléments d’une collection. Si les éléments de la collection sont de type Set ou Map, nous pouvons utiliser TreeSet ou TreeMap. Cependant, nous ne pouvons pas trier les éléments de List. La classe Collections fournit également des méthodes pour trier les éléments des éléments de type Liste.

Méthode de classe Collections pour trier les éléments de la liste

tri public void (Liste liste, Comparateur c): est utilisé pour trier les éléments de List par le comparateur donné.


Exemple de comparateur Java (ancien style non générique)

Voyons l'exemple du tri des éléments de List en fonction de l'âge et du nom. Dans cet exemple, nous avons créé 4 classes Java :

  1. Étudiant.java
  2. AgeComparator.java
  3. NomComparator.java
  4. Simple.java
Étudiant.java

Cette classe contient trois champs rollno, name et age et un constructeur paramétré.

 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

Cette classe définit une logique de comparaison basée sur l'âge. Si l'âge du premier objet est supérieur à celui du second, nous renvoyons une valeur positive. Il peut s'agir de n'importe qui, par exemple 1, 2, 10. Si l'âge du premier objet est inférieur à celui du deuxième objet, nous renvoyons une valeur négative, il peut s'agir de n'importe quelle valeur négative, et si l'âge des deux objets est égal, nous renvoyons 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; } } 
NomComparator.java

Cette classe fournit une logique de comparaison basée sur le nom. Dans ce cas, nous utilisons la méthode compareTo() de la classe String, qui fournit en interne la logique de comparaison.

 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

Dans cette classe, nous imprimons les valeurs de l'objet en triant sur la base du nom et de l'âge.

 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 

Exemple de comparateur Java (générique)

Étudiant.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; } } 
NomComparator.java

Cette classe fournit une logique de comparaison basée sur le nom. Dans ce cas, nous utilisons la méthode compareTo() de la classe String, qui fournit en interne la logique de comparaison.

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

Dans cette classe, nous imprimons les valeurs de l'objet en triant sur la base du nom et de l'âge.

 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 

Interface du comparateur Java 8

L'interface Java 8 Comparator est une interface fonctionnelle qui ne contient qu'une seule méthode abstraite. Désormais, nous pouvons utiliser l'interface Comparator comme cible d'affectation pour une expression lambda ou une référence de méthode.

Méthodes de l'interface de comparaison Java 8

MéthodeDescription
int comparer (T o1, T o2)Il compare le premier objet avec le deuxième objet.
statiqueComparateur comparant (Fonction keyExtractor)Il accepte une fonction qui extrait une clé de tri comparable d'un type T et renvoie un comparateur qui compare par cette clé de tri.
Comparateur statique comparant (Fonction keyExtractor, Comparator keyComparator)Il accepte une fonction qui extrait une clé de tri d'un type T et renvoie un Comparator qui compare par cette clé de tri à l'aide du Comparator spécifié.
Comparateur statique comparantDouble (ToDoubleFunction keyExtractor)Il accepte une fonction qui extrait une clé de tri double d'un type T et renvoie un comparateur qui compare par cette clé de tri.
Comparateur statique comparantInt (ToIntFunction keyExtractor)Il accepte une fonction qui extrait une clé de tri int d'un type T et renvoie un comparateur qui compare par cette clé de tri.
Comparateur statique comparantLong (ToLongFunction keyExtractor)Il accepte une fonction qui extrait une clé de tri longue d'un type T et renvoie un comparateur qui compare par cette clé de tri.
booléen égal (Objet obj)Il est utilisé pour comparer l'objet actuel avec l'objet spécifié.
statiqueComparateur naturalOrder()Il renvoie un comparateur qui compare les objets comparables dans l'ordre naturel.
Comparateur statique nullsFirst (Comparateur comparateur)Il renvoie un comparateur qui traite les éléments nuls comme étant inférieurs aux éléments non nuls.
Comparateur statique nullsLast (comparateur comparateur)Il renvoie un comparateur qui considère que les éléments nuls sont supérieurs aux éléments non nuls.
Comparateur par défaut inversé()Il renvoie un comparateur qui contient l'ordre inverse du comparateur fourni.
statiqueComparateur reverseOrder()Il renvoie un comparateur qui contient l'ordre inverse de l'ordre naturel.
Comparateur par défaut thenComparing (Comparateur autre)Il renvoie un comparateur d'ordre lexicographique avec un autre comparateur.
défautComparateur puis Comparaison (Fonction keyExtractor)Il renvoie un comparateur d'ordre lexicographique avec une fonction qui extrait une clé de tri comparable.
Comparateur par défaut thenComparing (Fonction keyExtractor, Comparator keyComparator)Il renvoie un comparateur d'ordre lexicographique avec une fonction qui extrait une clé à comparer avec le comparateur donné.
Comparateur par défaut thenComparingDouble (ToDoubleFunction keyExtractor)Il renvoie un comparateur d'ordre lexicographique avec une fonction qui extrait une clé de tri double.
Comparateur par défaut thenComparingInt (ToIntFunction keyExtractor)Il renvoie un comparateur d'ordre lexicographique avec une fonction qui extrait une clé de tri int.
Comparateur par défaut thenComparingLong (ToLongFunction keyExtractor)Il renvoie un comparateur d'ordre lexicographique avec une fonction qui extrait une clé de tri longue.

Exemple de comparateur Java 8

Voyons l'exemple du tri des éléments de List en fonction de l'âge et du nom.

Fichier : Étudiant.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; } } 

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

Exemple de comparateur Java 8 : méthodes nullsFirst() et nullsLast()

Ici, nous trions la liste des éléments qui contiennent également null.

Fichier : Étudiant.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; } } 

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