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, AlicePara 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.
Desafio
FácilVamos 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) erating(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étodocompareTo(). Os filmes devem ser ordenados por avaliação em ordem decrescente (os mais bem avaliados primeiro). Ao comparar doubles, useDouble.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,ratingAnalise cada linha para criar objetos Movie, adicione-os a um
ArrayListe, em seguida, useCollections.sort()para ordenar a lista. Graças à sua implementação deComparable, 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 agePara 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); // DescendingExperimente 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)
}
}
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
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator