Interface Comparator
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 45 de 87.
Embora Comparable defina a ordenação natural de uma classe, às vezes você precisa ordenar objetos de maneiras diferentes. A interface Comparator permite criar uma lógica de comparação separada sem modificar a classe original.
Um Comparator é um objeto externo que compara dois objetos do mesmo tipo. Isso é útil quando você quer várias opções de ordenação ou quando não pode modificar a própria classe:
import java.util.Comparator;
class NameComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
}
class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
}Você pode então passar o comparador para os métodos de ordenação:
List<Person> people = new ArrayList<>();
people.add(new Person("Charlie", 30));
people.add(new Person("Alice", 25));
Collections.sort(people, new NameComparator()); // Ordenado por nome
Collections.sort(people, new AgeComparator()); // Ordenado por idadePara obter um código conciso, você pode usar expressões lambda, pois Comparator é uma interface funcional:
Collections.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));A principal diferença: Comparable é implementado pela class que está sendo comparada e define uma única ordem natural, enquanto Comparator é uma class separada que pode definir ordenações personalizadas ilimitadas.
Desafio
FácilVamos criar um sistema de ordenação de funcionários que demonstra o poder da interface Comparator. Você criará vários comparadores para ordenar funcionários de diferentes maneiras, por salário e por nome, sem modificar a própria classe Employee.
Você organizará seu código em quatro arquivos:
Employee.java: Crie uma classe que represente um funcionário com três campos privados:name(String),department(String) esalary(double). Inclua um construtor para inicializar todos os campos e métodos getter para cada um deles. SobrescrevatoString()para retornar:[name] ([department]) - $[salary]SalaryComparator.java: Crie um comparador que ordene os funcionários por salário em ordem decrescente (os mais bem pagos primeiro). Implemente a interfaceComparator<Employee>e seu métodocompare(). UseDouble.compare()para comparar valores de salário com segurança.NameComparator.java: Crie outro comparador que ordene os funcionários alfabeticamente por nome em ordem crescente (de A a Z). ImplementeComparator<Employee>e use o métodocompareTo()de String para a comparação.Main.java: Reúna tudo criando uma lista de funcionários e ordenando-a usando seus comparadores. Você receberá os dados de três funcionários, cada um em uma linha separada, no formato:name,department,salaryCrie um
ArrayListde funcionários e, em seguida, demonstre as duas abordagens de ordenação:- Primeiro, ordene por salário usando seu
SalaryComparatore imprima cada funcionário - Imprima uma linha vazia
- Depois, ordene por nome usando seu
NameComparatore imprima cada funcionário
- Primeiro, ordene por salário usando seu
Você receberá três linhas de entrada, cada uma contendo os dados de um funcionário no formato: name,department,salary
Por exemplo, uma linha de entrada poderia ser: Alice,Engineering,75000.0
Lembre-se de importar java.util.Comparator nos arquivos dos comparadores e java.util.ArrayList, java.util.Collections e java.util.Scanner no seu arquivo Main. Observe como os comparadores permitem definir várias estratégias de ordenação externamente: a classe Employee não precisa saber nada sobre como pode ser ordenada!
Experimente você mesmo
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leia três funcionários da entrada
// Formato de cada linha: name,department,salary
String line1 = scanner.nextLine();
String line2 = scanner.nextLine();
String line3 = scanner.nextLine();
// TODO: Faça o parse de cada linha e crie objetos Employee
// Dica: Use split(",") para separar os valores
// TODO: Crie um ArrayList de funcionários e adicione os três
// TODO: Ordene por salário usando SalaryComparator e imprima cada funcionário
// Dica: Use Collections.sort(list, comparator)
// TODO: Imprima uma linha vazia
// TODO: Ordene por nome usando NameComparator e imprima cada funcionário
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão IteratorPratique por conta própria: Compilador de Java online