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 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 seu método compareTo() em vez de usar subtração: return this.name.compareTo(other.name);. Esta abordagem é mais segura e lida com casos extremos adequadamente.

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 do mais bem avaliado para o menos avaliado.

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

  • Movie.java: Crie uma classe que represente 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!

Folha de consulta

A interface Comparable permite que objetos definam sua ordenação natural para ordenação automática.

Implemente o método compareTo() que retorna:

  • 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 int age;
    
    @Override
    public int compareTo(Person other) {
        return this.age - other.age;  // Sort by age ascending
    }
}

Ordene objetos usando Collections.sort():

List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people);  // Sorted by age

Para comparar strings, delegue para o método compareTo() delas:

return this.name.compareTo(other.name);

Para comparar doubles com segurança, use Double.compare():

return Double.compare(this.rating, other.rating);  // Ascending
return Double.compare(other.rating, this.rating);  // Descending

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: Criar um ArrayList para armazenar objetos Movie
        
        // TODO: Analisar cada linha (formato: title,director,rating)
        // Hint: Use split(",") para separar as partes
        // Hint: Use Double.parseDouble() para a classificação (rating)
        
        // TODO: Criar objetos Movie e adicioná-los à lista
        
        // TODO: Ordenar a lista usando Collections.sort()
        
        // TODO: Imprimir 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