logo

Interfaz del comparador Java

Interfaz del comparador Java se utiliza para ordenar los objetos de una clase definida por el usuario.

Esta interfaz se encuentra en el paquete java.util y contiene 2 métodos comparar (Objeto obj1, Objeto obj2) y igual (elemento Objeto).

Proporciona múltiples secuencias de clasificación, es decir, puede ordenar los elementos según cualquier miembro de datos, por ejemplo, número de lista, nombre, edad o cualquier otra cosa.

Métodos de la interfaz del comparador Java

MétodoDescripción
comparación int pública (Objeto obj1, Objeto obj2)Compara el primer objeto con el segundo objeto.
público booleano es igual (Objeto obj)Se utiliza para comparar el objeto actual con el objeto especificado.
público booleano es igual (Objeto obj)Se utiliza para comparar el objeto actual con el objeto especificado.

Clase de colecciones

Colecciones La clase proporciona métodos estáticos para ordenar los elementos de una colección. Si los elementos de la colección son de Set o Map, podemos usar TreeSet o TreeMap. Sin embargo, no podemos ordenar los elementos de List. La clase Colecciones también proporciona métodos para ordenar los elementos de tipo Lista.

Método de clase Colecciones para ordenar elementos de Lista

clasificación de vacío público (lista de lista, comparador c): se utiliza para ordenar los elementos de la Lista por el Comparador dado.


Ejemplo de comparador de Java (estilo antiguo no genérico)

Veamos el ejemplo de ordenar los elementos de Lista según la edad y el nombre. En este ejemplo, hemos creado 4 clases de Java:

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

Esta clase contiene tres campos rollno, nombre y edad y un constructor parametrizado.

 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

Esta clase define la lógica de comparación basada en la edad. Si la edad del primer objeto es mayor que la del segundo, devolvemos un valor positivo. Puede ser cualquiera como 1, 2, 10. Si la edad del primer objeto es menor que la del segundo objeto, devolvemos un valor negativo, puede ser cualquier valor negativo, y si la edad de ambos objetos es igual, estamos devolviendo 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

Esta clase proporciona lógica de comparación basada en el nombre. En tal caso, estamos utilizando el método compareTo() de la clase String, que proporciona internamente la lógica de comparación.

 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 esta clase, imprimimos los valores del objeto clasificándolos según el nombre y la edad.

 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 

Ejemplo de comparador de Java (genérico)

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

Esta clase proporciona lógica de comparación basada en el nombre. En tal caso, estamos utilizando el método compareTo() de la clase String, que proporciona internamente la lógica de comparación.

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

En esta clase, imprimimos los valores del objeto clasificándolos según el nombre y la edad.

 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 

Interfaz del comparador Java 8

La interfaz Java 8 Comparator es una interfaz funcional que contiene solo un método abstracto. Ahora, podemos usar la interfaz Comparator como destino de asignación para una expresión lambda o referencia de método.

Métodos de la interfaz del comparador Java 8

MétodoDescripción
int comparar(T o1, T o2)Compara el primer objeto con el segundo objeto.
estáticoComparador comparando(Tecla de funciónExtractor)Acepta una función que extrae una clave de clasificación Comparable de un tipo T y devuelve un Comparador que compara según esa clave de clasificación.
Comparador estático comparando (Extractor de teclas de función, Comparador de teclas de comparación)Acepta una función que extrae una clave de clasificación de un tipo T y devuelve un Comparador que compara mediante esa clave de clasificación utilizando el Comparador especificado.
Comparador estático comparandoDoble(ToDoubleFunction keyExtractor)Acepta una función que extrae una clave de clasificación doble de un tipo T y devuelve un Comparador que compara según esa clave de clasificación.
Comparador estático comparandoInt(ToIntFunction keyExtractor)Acepta una función que extrae una clave de clasificación int de un tipo T y devuelve un Comparador que compara según esa clave de clasificación.
Comparador estático comparandoLong(ToLongFunction keyExtractor)Acepta una función que extrae una clave de clasificación larga de un tipo T y devuelve un Comparador que compara según esa clave de clasificación.
booleano es igual (Objeto obj)Se utiliza para comparar el objeto actual con el objeto especificado.
estáticoComparador naturalOrder()Devuelve un comparador que compara objetos comparables en orden natural.
Comparador estático nullsFirst(Comparador comparador)Devuelve un comparador que trata los elementos nulos como menores que los elementos no nulos.
Comparador estático nullsLast(Comparador comparador)Devuelve un comparador que trata a los elementos nulos como mayores que los elementos no nulos.
Comparador predeterminado invertido()Devuelve un comparador que contiene el orden inverso del comparador proporcionado.
estáticoComparador orden inverso ()Devuelve un comparador que contiene el orden inverso al natural.
Comparador predeterminado y luego Comparar (Comparador otro)Devuelve un comparador de orden lexicográfico con otro comparador.
por defectoComparador y luego Comparar(Tecla de funciónExtractor)Devuelve un comparador de orden lexicográfico con una función que extrae una clave de clasificación comparable.
Comparador predeterminado y luego Comparar (Extractor de teclas de función, Comparador de teclas de comparación)Devuelve un comparador de orden lexicográfico con una función que extrae una clave para compararla con el Comparador dado.
Comparador predeterminado y luego ComparandoDoble(ToDoubleFunction keyExtractor)Devuelve un comparador de orden lexicográfico con una función que extrae una clave de clasificación doble.
Comparador predeterminado y luego CompararInt(ToIntFunction keyExtractor)Devuelve un comparador de orden lexicográfico con una función que extrae una clave de clasificación int.
Comparador predeterminado y luego ComparandoLong(ToLongFunction keyExtractor)Devuelve un comparador de orden lexicográfico con una función que extrae una clave de clasificación larga.

Ejemplo de comparador de Java 8

Veamos el ejemplo de ordenar los elementos de Lista según la edad y el nombre.

Archivo: Estudiante.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; } } 

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

Ejemplo de comparador de Java 8: método nullsFirst() y nullsLast()

Aquí, ordenamos la lista de elementos que también contiene nulo.

Archivo: Estudiante.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; } } 

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