cami-la / collections-java-api-2023

Este repositório é referente ao curso "Collection Framework API Java" e é uma valiosa contribuição para a comunidade de desenvolvedores Java, fornecendo exemplos práticos e recursos educacionais relacionados à poderosa API de coleções da linguagem Java.
https://web.dio.me/course/conhecendo-collections-java/learning/c5d6f4e1-6d05-4eea-93d8-d292c708999f
876 stars 636 forks source link

Dúvida no entendimento do Comparable #12

Open BrunoSenigalha opened 11 months ago

BrunoSenigalha commented 11 months ago

Olá Camila. A minha dúvida sobre o comparable está no seguinte código:

@Override public int compareTo(Pessoa pessoa) { return Integer.compare(idade, pessoa.getIdade()); }

Não exatamente no que ele está fazendo, eu consigo entender que está fazendo a comparação entre as idades, mas a minha dúvida é como isso funcionaria dentro da classe, por exemplo: Quando se cria uma lista de Pessoas, vão sendo criadas espaços na memória de objetos do tipo Pessoa certo? Mas quando se compara a lista de pessoas que é passado por parâmetro com a idade que está dentro da classe, como funciona?

Deixa eu tentar fazer uma pergunta menos confusa kkkk.

public List<Pessoa> ordenarPorIdade() { List<Pessoa> pessoasPorIdade = new ArrayList<>(pessoaList); Collections.sort(pessoasPorIdade); return pessoasPorIdade; }

Nesse caso, o que eu não consigo entender é como é feita essa comparação, já que está sendo comparado a Lista pessoa com o próprio atributo dentro da classe....

cami-la commented 11 months ago

Ótima pergunta, @BrunoSenigalha.

Bora lá:

A interface Comparable serve para definir a ordem natural do objeto. Seguem exemplos de ordenação de objetos com as seguintes classes:

    List<String> names = Arrays.asList("Camila", "Maria", "João", "Anna");
    Collections.sort(names);
    System.out.println(names);
    //resultado: [Anna, Camila, João, Maria]
    List<Integer> numbers = Arrays.asList(8, 50, 3, 5);
    Collections.sort(numbers);
    System.out.println(numbers);
    //resultado: [3, 5, 8, 50]
    @Override 
    public int compareTo(Pessoa pessoa) {
        return Integer.compare(idade, pessoa.getIdade()); //return Integer.compare(primeiro elemento a ser comparado, segundo elemento a ser comparado)
    }
  1. Vamos supor que a idade das pessoas dentro da lista sejam 8, 50, 3, 5.
    • Aí quando 8 é comparado com 50, o método compareTo de Integer retorna um valor negativo, indicando que 8 é menor que 50. Isso faz com que esses dois números sejam trocados de posição na lista, colocando o 8 antes do 50.
    • O processo de comparação e troca continua para os outros elementos na lista até que todos estejam na ordem correta.
  2. Beleza, agora que foi definido a ordem natural dos objetos do tipo Pessoa, agora você vai utilizar o método estático Collections.sort(pessoasPorIdade); que está recebendo uma lista que contém elementos do tipo Pessoa.
  3. Como o tipo Pessoa já tem a ordem natural por idade, agora é só "correr para o abraço" e sua lista está ordenada. (:
    public List<Pessoa> ordenarPorIdade() {
        List<Pessoa> pessoasPorIdade = new ArrayList<>(pessoaList); 
        Collections.sort(pessoasPorIdade); 
        return pessoasPorIdade; 
}
BrunoSenigalha commented 11 months ago

Muito obrigado @cami-la ! Ajudou bastante!