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 os objetos definam sua ordenação natural. Ao implementar essa 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(). Esse método compara o objeto atual com outro objeto e retorna um inteiro indicando a ordem relativa entre eles:

  • Valor negativo: este objeto vem antes do outro
  • Zero: os dois 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 crescente
    }
}

Depois de implementada, a ordenação se torna simples:

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 ao método compareTo() em vez de usar subtração: return this.name.compareTo(other.name);. Essa abordagem é mais segura e trata os casos extremos adequadamente. Para campos int, prefira Integer.compare(a, b) a a - b, pois a subtração pode causar overflow com valores extremos.

challenge icon

Desafio

Fácil

Vamos criar um sistema de classificação de filmes que usa a interface Comparable para ordenar filmes pelas 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 avaliação.

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

  • Movie.java: Crie uma classe que represente um filme que possa ser comparado com outros filmes. Um Movie tem 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 pela avaliação em ordem decrescente (maior avaliação primeiro). Ao comparar valores double, 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-a. Você receberá os dados de 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 serão organizados automaticamente pela avaliação!

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

Você receberá três linhas de entrada, cada uma contendo dados de um filme 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 no seu arquivo Main. Observe como implementar Comparable permite ordenar seus objetos personalizados com uma única chamada de método: nenhum comparador adicional é necessário!

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);
        
        // Leia 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: Faça o parse de cada linha (formato: title,director,rating)
        // Dica: Use split(",") para separar as partes
        // Dica: Use Double.parseDouble() para a avaliação
        
        // 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

Pratique por conta própria: Compilador de Java online