Menu
Coddy logo textTech

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 idade

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

challenge icon

Desafio

Fácil

Vamos 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) e salary (double). Inclua um construtor para inicializar todos os campos e métodos getter para cada um deles. Sobrescreva toString() 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 interface Comparator<Employee> e seu método compare(). Use Double.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). Implemente Comparator<Employee> e use o método compareTo() 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,salary

    Crie um ArrayList de funcionários e, em seguida, demonstre as duas abordagens de ordenação:

    1. Primeiro, ordene por salário usando seu SalaryComparator e imprima cada funcionário
    2. Imprima uma linha vazia
    3. Depois, ordene por nome usando seu NameComparator e imprima cada funcionário

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
    }
}
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de Java online