Menu
Coddy logo textTech

compareTo() e Comparable

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 44 de 87.

A interface Comparable permite que objetos definam sua ordenação natural. Ao implementar esta interface, sua classe pode ser ordenada automaticamente usando métodos como Collections.sort() ou armazenada em coleções ordenadas como TreeSet.

A interface exige que você implemente um único método: compareTo(). Este método compara o objeto atual com outro objeto e retorna um número inteiro indicando sua ordem relativa:

  • Valor negativo: este objeto vem antes do outro
  • Zero: ambos os objetos são iguais
  • Valor positivo: este objeto vem depois do outro
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 idade em ordem crescente
    }
}

Uma vez implementado, a ordenação torna-se direta:

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

Para comparar strings ou outros campos Comparable, você pode delegar para o método compareTo() deles em vez de usar subtração: return this.name.compareTo(other.name);. Esta abordagem é mais segura e lida com casos extremos adequadamente. Para campos int, prefira Integer.compare(a, b) em vez de a - b, porque a subtração pode resultar em overflow com valores extremos.

challenge icon

Desafio

Fácil

Vamos construir um sistema de classificação de filmes que utiliza a interface Comparable para ordenar filmes por suas avaliações. Você criará uma classe Movie que sabe como se comparar com outros filmes, permitindo a ordenação automática da maior para a menor nota.

Você organizará seu código em dois arquivos:

  • Movie.java: Crie uma classe que representa um filme que pode ser comparado com outros filmes. Um Movie possui três campos privados: title (String), director (String) e rating (double, de 0.0 a 10.0). Inclua um construtor para inicializar todos os campos e métodos getter para cada um.

    Faça sua classe Movie implementar Comparable<Movie> e sobrescreva o método compareTo(). Os filmes devem ser ordenados por avaliação em ordem decrescente (os mais bem avaliados primeiro). Ao comparar doubles, use Double.compare() para uma comparação segura — lembre-se de inverter a ordem para a ordenação decrescente!

    Sobrescreva toString() para retornar: [title] by [director] - Rating: [rating]

  • Main.java: Dê vida à sua classe Movie criando uma lista de filmes e ordenando-os. Você receberá a entrada para três filmes, cada um em uma linha separada no formato: title,director,rating

    Analise cada linha para criar objetos Movie, adicione-os a um ArrayList e, em seguida, use Collections.sort() para ordenar a lista. Graças à sua implementação de Comparable, os filmes se organizarão automaticamente por avaliação!

    Após a ordenação, imprima cada filme em sua própria linha usando o formato toString(). O filme com a maior avaliação deve aparecer primeiro.

Você receberá três linhas de entrada, cada uma contendo dados de filmes no formato: title,director,rating

Por exemplo, uma linha de entrada pode ser: Inception,Christopher Nolan,8.8

Lembre-se de importar java.util.ArrayList, java.util.Collections e java.util.Scanner em seu arquivo Main. Observe como a implementação de Comparable permite que você ordene seus objetos personalizados com uma única chamada de método — sem a necessidade de um comparador extra!

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);
        
        // Lê três linhas de dados de filmes
        String line1 = scanner.nextLine();
        String line2 = scanner.nextLine();
        String line3 = scanner.nextLine();
        
        // TODO: Crie um ArrayList para armazenar objetos Movie
        
        // TODO: Analise cada linha (formato: title,director,rating)
        // Dica: Use split(",") para separar as partes
        // Dica: Use Double.parseDouble() para o rating
        
        // TODO: Crie objetos Movie e adicione-os à lista
        
        // TODO: Ordene a lista usando Collections.sort()
        
        // TODO: Imprima cada filme (um por linha)
    }
}
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