Menu
Coddy logo textTech

compareTo() y Comparable

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 44 de 87.

La interfaz Comparable permite que los objetos definan su orden natural. Al implementar esta interfaz, su clase puede ser ordenada automáticamente utilizando métodos como Collections.sort() o almacenada en colecciones ordenadas como TreeSet.

La interfaz requiere que implementes un único método: compareTo(). Este método compara el objeto actual con otro objeto y devuelve un entero que indica su orden relativo:

  • Valor negativo: este objeto va antes que el otro
  • Cero: ambos objetos son iguales
  • Valor positivo: este objeto va después del otro
public class Person implements Comparable<Person> {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);  // Ordenar por edad de forma ascendente
    }
}

Una vez implementado, la ordenación se vuelve sencilla:

List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people);  // Ahora ordenado por edad: Bob, Alice

Para comparar cadenas u otros campos Comparable, puedes delegar en su método compareTo() en lugar de usar la resta: return this.name.compareTo(other.name);. Este enfoque es más seguro y maneja los casos extremos adecuadamente. Para campos int, prefiere Integer.compare(a, b) en lugar de a - b, porque la resta puede desbordarse con valores extremos.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de clasificación de películas que utiliza la interfaz Comparable para ordenar las películas por sus calificaciones. Crearás una clase Movie que sepa cómo compararse con otras películas, permitiendo el ordenamiento automático de mayor a menor calificación.

Organizarás tu código en dos archivos:

  • Movie.java: Crea una clase que represente una película que pueda compararse con otras películas. Una Movie tiene tres campos privados: title (String), director (String) y rating (double, de 0.0 a 10.0). Incluye un constructor para inicializar todos los campos y métodos getter para cada uno.

    Haz que tu clase Movie implemente Comparable<Movie> y sobrescriba el método compareTo(). Las películas deben ordenarse por calificación en orden descendente (la calificación más alta primero). Al comparar doubles, utiliza Double.compare() para una comparación segura; ¡recuerda invertir el orden para el ordenamiento descendente!

    Sobrescribe toString() para devolver: [title] by [director] - Rating: [rating]

  • Main.java: Da vida a tu clase Movie creando una lista de películas y ordenándolas. Recibirás la entrada de tres películas, cada una en una línea separada con el formato: title,director,rating

    Analiza cada línea para crear objetos Movie, añádelos a un ArrayList, y luego usa Collections.sort() para ordenar la lista. ¡Gracias a tu implementación de Comparable, las películas se organizarán automáticamente por calificación!

    Después de ordenar, imprime cada película en su propia línea usando el formato toString(). La película con la calificación más alta debe aparecer primero.

Recibirás tres líneas de entrada, cada una con datos de películas en el formato: title,director,rating

Por ejemplo, una línea de entrada podría verse así: Inception,Christopher Nolan,8.8

Recuerda importar java.util.ArrayList, java.util.Collections y java.util.Scanner en tu archivo Main. ¡Observa cómo implementar Comparable te permite ordenar tus objetos personalizados con una sola llamada a un método, sin necesidad de un comparador adicional!

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 líneas de datos de películas
        String line1 = scanner.nextLine();
        String line2 = scanner.nextLine();
        String line3 = scanner.nextLine();
        
        // TODO: Crea un ArrayList para almacenar objetos Movie
        
        // TODO: Analiza cada línea (formato: title,director,rating)
        // Hint: Usa split(",") para separar las partes
        // Hint: Usa Double.parseDouble() para el rating
        
        // TODO: Crea objetos Movie y añádelos a la lista
        
        // TODO: Ordena la lista usando Collections.sort()
        
        // TODO: Imprime cada película (una por línea)
    }
}
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