logo

Interfície Java Comparator

Interfície Java Comparator s'utilitza per ordenar els objectes d'una classe definida per l'usuari.

Aquesta interfície es troba al paquet java.util i conté 2 mètodes compare (Object obj1, Object obj2) i equals (Object element).

Proporciona múltiples seqüències d'ordenació, és a dir, podeu ordenar els elements en funció de qualsevol membre de les dades, per exemple, rollno, nom, edat o qualsevol altra cosa.

Mètodes de la interfície de comparació de Java

MètodeDescripció
public int compare(Objecte obj1, Objecte obj2)Compara el primer objecte amb el segon objecte.
booleà públic és igual a (objecte objecte)S'utilitza per comparar l'objecte actual amb l'objecte especificat.
booleà públic és igual a (objecte objecte)S'utilitza per comparar l'objecte actual amb l'objecte especificat.

Classe de col·leccions

Col·leccions class proporciona mètodes estàtics per ordenar els elements d'una col·lecció. Si els elements de la col·lecció són de Set o Map, podem utilitzar TreeSet o TreeMap. Tanmateix, no podem ordenar els elements de List. La classe Col·leccions també proporciona mètodes per ordenar els elements dels elements del tipus Llista.

Mètode de la classe Col·leccions per ordenar els elements de la llista

public void sort (llista de llista, comparador c): s'utilitza per ordenar els elements de List pel comparador donat.


Exemple de comparador de Java (estil antic no genèric)

Vegem l'exemple d'ordenació dels elements de List en funció de l'edat i el nom. En aquest exemple, hem creat 4 classes java:

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

Aquesta classe conté tres camps rollno, nom i edat i un constructor parametritzat.

 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

Aquesta classe defineix la lògica de comparació en funció de l'edat. Si l'edat del primer objecte és més gran que el segon, estem retornant un valor positiu. Pot ser qualsevol persona com 1, 2, 10. Si l'edat del primer objecte és menor que la del segon, estem retornant un valor negatiu, pot ser qualsevol valor negatiu, i si l'edat dels dos objectes és igual, tornem 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

Aquesta classe proporciona una lògica de comparació basada en el nom. En aquest cas, estem utilitzant el mètode compareTo() de la classe String, que proporciona internament la lògica de comparació.

 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

En aquesta classe, estem imprimint els valors de l'objecte ordenant-los segons el nom i l'edat.

 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 comparador de Java (genèric)

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

Aquesta classe proporciona una lògica de comparació basada en el nom. En aquest cas, estem utilitzant el mètode compareTo() de la classe String, que proporciona internament la lògica de comparació.

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

En aquesta classe, estem imprimint els valors de l'objecte ordenant-los segons el nom i l'edat.

 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 

Interfície de comparació de Java 8

La interfície de comparació de Java 8 és una interfície funcional que només conté un mètode abstracte. Ara, podem utilitzar la interfície Comparator com a objectiu d'assignació d'una expressió lambda o referència de mètode.

Mètodes de la interfície de comparació de Java 8

MètodeDescripció
int compara (T o1, T o2)Compara el primer objecte amb el segon objecte.
estàticaComparador de comparació (Extractor de claus de funció)Accepta una funció que extreu una clau d'ordenació comparable d'un tipus T i retorna un comparador que compara amb aquesta clau d'ordenació.
Comparador estàtic de comparació (Extractor de claus de funció, Comparador de claus de comparació)Accepta una funció que extreu una clau d'ordenació d'un tipus T i retorna un comparador que compara amb aquesta clau d'ordenació mitjançant el comparador especificat.
Comparador estàtic que compara el doble (ToDoubleFunction keyExtractor)Accepta una funció que extreu una clau d'ordenació doble d'un tipus T i retorna un comparador que compara amb aquesta clau d'ordenació.
Comparador estàtic comparingInt(ToIntFunction keyExtractor)Accepta una funció que extreu una clau d'ordenació int d'un tipus T i retorna un comparador que compara amb aquesta clau d'ordenació.
Comparador estàtic comparantLong (ToLongFunction keyExtractor)Accepta una funció que extreu una clau d'ordenació llarga d'un tipus T i retorna un comparador que compara amb aquesta clau d'ordenació.
booleà iguals (objecte objecte)S'utilitza per comparar l'objecte actual amb l'objecte especificat.
estàticaComparador naturalOrder()Retorna un comparador que compara objectes comparables en ordre natural.
static Comparator nullsFirst(Comparador de comparació)Retorna un comparador que considera que els elements nuls són menors que els elements no nuls.
static Comparator nullsLast (Comparador de comparació)Retorna un comparador que considera nul com a major que els elements no nuls.
Comparador predeterminat invertit ()Retorna un comparador que conté l'ordre invers del comparador proporcionat.
estàticaComparador reverseOrder()Retorna un comparador que conté l'ordre invers de l'ordre natural.
Comparador per defecte i després Comparació (Comparador altre)Retorna un comparador d'ordre lexicogràfic amb un altre comparador.
per defecteComparador i després comparació (Extractor de claus de funció)Retorna un comparador d'ordre lexicogràfic amb una funció que extreu una clau d'ordenació comparable.
Comparador predeterminat i després Comparació (Extractor de claus de funció, Comparador de claus de comparació)Retorna un comparador d'ordre lexicogràfic amb una funció que extreu una clau per comparar amb el comparador donat.
Comparador predeterminat i després ComparingDouble (ToDoubleFunction keyExtractor)Retorna un comparador d'ordre lexicogràfic amb una funció que extreu una clau d'ordenació doble.
Comparador predeterminat i desprésComparingInt(ToIntFunction KeyExtractor)Retorna un comparador d'ordre lexicogràfic amb una funció que extreu una clau d'ordenació int.
Comparador predeterminat i després ComparingLong (ToLongFunction keyExtractor)Retorna un comparador d'ordre lexicogràfic amb una funció que extreu una clau d'ordenació llarga.

Exemple de comparació de Java 8

Vegem l'exemple d'ordenació dels elements de List en funció de l'edat i el nom.

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

Fitxer: 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 comparació de Java 8: mètode nullsFirst() i nullsLast().

Aquí, ordenem la llista d'elements que també conté null.

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

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