collections-java-api-2023 icon indicating copy to clipboard operation
collections-java-api-2023 copied to clipboard

Dúvida no entendimento do Comparable

Open BrunoSenigalha opened this issue 2 years ago • 2 comments

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....

BrunoSenigalha avatar Aug 22 '23 11:08 BrunoSenigalha

Ó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:

  • Classe String (Já implementa o Comparable e ordena naturalmente pela ordem alfabética)
    List<String> names = Arrays.asList("Camila", "Maria", "João", "Anna");
    Collections.sort(names);
    System.out.println(names);
    //resultado: [Anna, Camila, João, Maria]
  • Classe Integer (Já implementa o Comparablee ordena naturalmente pela ordem numérica)
    List<Integer> numbers = Arrays.asList(8, 50, 3, 5);
    Collections.sort(numbers);
    System.out.println(numbers);
    //resultado: [3, 5, 8, 50]
  • classe Pessoa
  1. Você implementou o Comparable e definiu através do metodo compareTo que a ordem natural dos objetos do tipo Pessoa será por idade.
  2. Como o atributo idade é um Integer, você terá definido que a ordenação desses objetos será pela ordem numérica das idades.
  3. Sendo assim, a classe Integer tem o método estático chamado compare Integer.compare() que vai fazer o papel de comparar cada elemento de dentro da Collection e saber qual é o menor, o maior e se são iguais. Assim, consegue ordenar uma sequência de números.
    @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.
  1. 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.
  2. 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; 
}

cami-la avatar Aug 22 '23 15:08 cami-la

Muito obrigado @cami-la ! Ajudou bastante!

BrunoSenigalha avatar Aug 22 '23 17:08 BrunoSenigalha