Dúvida no entendimento do Comparable
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....
Ó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 oComparablee 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 oComparablee 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
- Você implementou o
Comparablee definiu através do metodocompareToque a ordem natural dos objetos do tipoPessoaserá por idade. - Como o atributo idade é um
Integer, você terá definido que a ordenação desses objetos será pela ordem numérica das idades. - Sendo assim, a classe
Integertem o método estático chamado compareInteger.compare()que vai fazer o papel de comparar cada elemento de dentro daCollectione 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)
}
- Vamos supor que a idade das pessoas dentro da lista sejam 8, 50, 3, 5.
- Aí quando 8 é comparado com 50, o método
compareTodeIntegerretorna 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.
- Beleza, agora que foi definido a ordem natural dos objetos do tipo
Pessoa, agora você vai utilizar o método estáticoCollections.sort(pessoasPorIdade); que está recebendo uma lista que contém elementos do tipoPessoa. - Como o tipo
Pessoajá 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;
}
Muito obrigado @cami-la ! Ajudou bastante!