Menu
Coddy logo textTech

Interfaz Comparator

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 45 de 87.

Mientras Comparable define el orden natural de una clase, a veces necesitas ordenar objetos de diferentes maneras. La interfaz Comparator te permite crear una lógica de comparación independiente sin modificar la clase original.

Un Comparator es un objeto externo que compara dos objetos del mismo tipo. Esto resulta útil cuando quieres varias opciones de ordenación o cuando no puedes modificar la clase en sí:

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();
    }
}

Después puedes pasar el comparador a los métodos de ordenación:

List<Person> people = new ArrayList<>();
people.add(new Person("Charlie", 30));
people.add(new Person("Alice", 25));

Collections.sort(people, new NameComparator());  // Ordenado por nombre
Collections.sort(people, new AgeComparator());   // Ordenado por edad

Para escribir código conciso, puedes usar expresiones lambda, ya que Comparator es una interfaz funcional:

Collections.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));

La diferencia clave: Comparable es implementado por la clase que se está comparando y define un orden natural, mientras que Comparator es una clase independiente que puede definir un número ilimitado de ordenamientos personalizados.

challenge icon

Desafío

Fácil

Construyamos un sistema de ordenación de empleados que demuestre el poder de la interfaz Comparator. Crearás varios comparadores para ordenar empleados de diferentes maneras, por salario y por nombre, sin modificar la propia clase Employee.

Organizarás tu código en cuatro archivos:

  • Employee.java: Crea una clase que represente a un empleado con tres campos privados: name (String), department (String) y salary (double). Incluye un constructor para inicializar todos los campos y métodos getter para cada uno. Sobrescribe toString() para que devuelva: [name] ([department]) - $[salary]
  • SalaryComparator.java: Crea un comparador que ordene los empleados por salario en orden descendente (los mejor pagados primero). Implementa la interfaz Comparator<Employee> y su método compare(). Usa Double.compare() para comparar de forma segura los valores de salario.
  • NameComparator.java: Crea otro comparador que ordene los empleados alfabéticamente por nombre en orden ascendente (de A a Z). Implementa Comparator<Employee> y usa el método compareTo() de String para la comparación.
  • Main.java: Une todo creando una lista de empleados y ordenándola mediante tus comparadores. Recibirás los datos de tres empleados, cada uno en una línea independiente, con el formato: name,department,salary

    Crea un ArrayList de empleados y, después, demuestra ambos enfoques de ordenación:

    1. Primero, ordena por salario usando tu SalaryComparator e imprime cada empleado
    2. Imprime una línea vacía
    3. Después, ordena por nombre usando tu NameComparator e imprime cada empleado

Recibirás tres líneas de entrada, cada una con los datos de un empleado en el formato: name,department,salary

Por ejemplo, una línea de entrada podría tener este aspecto: Alice,Engineering,75000.0

Recuerda importar java.util.Comparator en tus archivos de comparadores, y java.util.ArrayList, java.util.Collections y java.util.Scanner en tu archivo Main. Observa cómo los comparadores te permiten definir varias estrategias de ordenación externamente: ¡la clase Employee no necesita saber nada sobre cómo podría ordenarse!

Pruébalo tú mismo

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);
        
        // Lee tres empleados de la entrada
        // Formato de cada línea: name,department,salary
        String line1 = scanner.nextLine();
        String line2 = scanner.nextLine();
        String line3 = scanner.nextLine();
        
        // TODO: Analiza cada línea y crea objetos Employee
        // Pista: Usa split(",") para separar los valores
        
        // TODO: Crea un ArrayList de empleados y añade los tres
        
        // TODO: Ordena por salario usando SalaryComparator e imprime cada empleado
        // Pista: Usa Collections.sort(list, comparator)
        
        // TODO: Imprime una línea vacía
        
        // TODO: Ordena por nombre usando NameComparator e imprime cada empleado
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Java online