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, AlicePara 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.
Desafio
FácilVamos 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) 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 pela avaliação em ordem decrescente (maior avaliação primeiro). Ao comparar valores double, 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-a. Você receberá os dados de 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 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)
}
}
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 IteratorPratique por conta própria: Compilador de Java online