logo

Interface do comparador Java

Interface do comparador Java é usado para ordenar os objetos de uma classe definida pelo usuário.

Esta interface é encontrada no pacote java.util e contém 2 métodos compare(Object obj1,Object obj2) e equals(Object element).

Ele fornece múltiplas sequências de classificação, ou seja, você pode classificar os elementos com base em qualquer membro de dados, por exemplo, rollno, nome, idade ou qualquer outra coisa.

Métodos de interface do comparador Java

MétodoDescrição
público int comparar (Objeto obj1, Objeto obj2)Ele compara o primeiro objeto com o segundo objeto.
booleano público é igual (objeto objeto)É usado para comparar o objeto atual com o objeto especificado.
booleano público é igual (objeto objeto)É usado para comparar o objeto atual com o objeto especificado.

Aula de coleções

Coleções classe fornece métodos estáticos para classificar os elementos de uma coleção. Se os elementos da coleção forem Set ou Map, podemos usar TreeSet ou TreeMap. No entanto, não podemos classificar os elementos de List. A classe Collections também fornece métodos para classificar os elementos dos elementos do tipo List.

Método da classe Collections para classificar os elementos da lista

classificação pública void (lista de lista, comparador c): é usado para classificar os elementos da Lista pelo Comparador fornecido.


Exemplo de comparador Java (estilo antigo não genérico)

Vejamos o exemplo de classificação dos elementos da Lista com base na idade e no nome. Neste exemplo, criamos 4 classes java:

  1. Aluno.java
  2. AgeComparator.java
  3. NomeComparator.java
  4. Simples.java
Aluno.java

Esta classe contém três campos rollno, name e age e um construtor 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 classe define a lógica de comparação com base na idade. Se a idade do primeiro objeto for maior que a do segundo, estamos retornando um valor positivo. Pode ser qualquer um, como 1, 2, 10. Se a idade do primeiro objeto for menor que a do segundo objeto, estamos retornando um valor negativo, pode ser qualquer valor negativo, e se a idade de ambos os objetos for igual, estamos retornando 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

Esta classe fornece lógica de comparação com base no nome. Nesse caso, estamos usando o método compareTo() da classe String, que fornece internamente a lógica de comparação.

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

Nesta classe, estamos imprimindo os valores do objeto classificando com base no nome e na idade.

 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 

Exemplo de comparador Java (genérico)

Aluno.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

Esta classe fornece lógica de comparação com base no nome. Nesse caso, estamos usando o método compareTo() da classe String, que fornece internamente a lógica de comparação.

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

Nesta classe, estamos imprimindo os valores do objeto classificando com base no nome e na idade.

 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 do comparador Java 8

A interface Java 8 Comparator é uma interface funcional que contém apenas um método abstrato. Agora, podemos usar a interface Comparator como destino de atribuição para uma expressão lambda ou referência de método.

Métodos de interface do comparador Java 8

MétodoDescrição
int comparar(T o1, T o2)Ele compara o primeiro objeto com o segundo objeto.
estáticoComparação do comparador (tecla de funçãoExtractor)Ele aceita uma função que extrai uma chave de classificação comparável de um tipo T e retorna um comparador que compara por essa chave de classificação.
comparação estática do comparador (função keyExtractor, comparador keyComparator)Ele aceita uma função que extrai uma chave de classificação de um tipo T e retorna um Comparador que compara por essa chave de classificação usando o Comparador especificado.
Comparador estático comparandoDouble (ToDoubleFunction keyExtractor)Ele aceita uma função que extrai uma chave de classificação dupla de um tipo T e retorna um Comparador que compara por essa chave de classificação.
Comparador estático comparandoInt (ToIntFunction keyExtractor)Ele aceita uma função que extrai uma chave de classificação int de um tipo T e retorna um Comparador que compara por essa chave de classificação.
Comparador estático comparandoLong (ToLongFunction keyExtractor)Ele aceita uma função que extrai uma chave de classificação longa de um tipo T e retorna um Comparador que compara por essa chave de classificação.
booleano é igual (objeto obj)É usado para comparar o objeto atual com o objeto especificado.
estáticoComparador naturalOrder()Ele retorna um comparador que compara objetos comparáveis ​​em ordem natural.
Comparador estático nullsFirst (Comparador comparador)Ele retorna um comparador que trata nulo como sendo menor que elementos não nulos.
Comparador estático nullsLast (Comparador comparador)Ele retorna um comparador que trata nulo como maior que elementos não nulos.
Comparador padrão invertido()Ele retorna um comparador que contém a ordem inversa do comparador fornecido.
estáticoComparador ordem reversa()Ele retorna um comparador que contém o reverso da ordem natural.
Comparador padrão entãoComparando(Comparador outro)Retorna um comparador de ordem lexicográfica com outro comparador.
padrãoComparador entãoComparando(tecla de funçãoExtrator)Ele retorna um comparador de ordem lexicográfica com uma função que extrai uma chave de classificação Comparable.
Comparador padrão thenComparing(Function keyExtractor, Comparator keyComparator)Retorna um comparador de ordem lexicográfica com uma função que extrai uma chave para ser comparada com o Comparador fornecido.
Comparador padrão thenComparingDouble (ToDoubleFunction keyExtractor)Ele retorna um comparador de ordem lexicográfica com uma função que extrai uma chave de classificação dupla.
Comparador padrão thenComparingInt (ToIntFunction keyExtractor)Ele retorna um comparador de ordem lexicográfica com uma função que extrai uma chave de classificação int.
Comparador padrão thenComparingLong (ToLongFunction keyExtractor)Ele retorna um comparador de ordem lexicográfica com uma função que extrai uma chave de classificação longa.

Exemplo de comparador Java 8

Vejamos o exemplo de classificação dos elementos da Lista com base na idade e no nome.

Arquivo: Aluno.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; } } 

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

Exemplo de comparador Java 8: métodos nullsFirst() e nullsLast()

Aqui, classificamos a lista de elementos que também contém nulo.

Arquivo: Aluno.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; } } 

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