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, tu clase se puede ordenar automáticamente mediante métodos como Collections.sort() o almacenarse 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 que el 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 ascendente
    }
}

Una vez implementada, 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 correctamente los casos límite. Para los campos int, es preferible usar Integer.compare(a, b) en lugar de a - b, porque la resta puede provocar un desbordamiento con valores extremos.

challenge icon

Desafío

Fácil

Construyamos un sistema de clasificación de películas que use la interfaz Comparable para ordenar las películas según sus puntuaciones. Crearás una clase Movie que sepa cómo compararse con otras películas, lo que permitirá ordenarlas automáticamente de la puntuación más alta a la más baja.

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 puntuación en orden descendente (la puntuación más alta primero). Al comparar valores double, usa Double.compare() para realizar una comparación segura: ¡recuerda invertir el orden para la clasificación descendente!

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

  • Main.java: Dale vida a tu clase Movie creando una lista de películas y ordenándolas. Recibirás los datos 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, después, usa Collections.sort() para ordenar la lista. Gracias a tu implementación de Comparable, ¡las películas se organizarán automáticamente por puntuación!

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

Recibirás tres líneas de entrada, cada una con los datos de una película 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: ¡no necesitas 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

Practica por tu cuenta: Compilador de Java online