Open BrunoSenigalha opened 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:
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]
Integer
(Já implementa o Comparable
e 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]
Pessoa
Comparable
e definiu através do metodo compareTo
que a ordem natural dos objetos do tipo Pessoa
será por idade. Integer
, você terá definido que a ordenação desses objetos será pela ordem numérica das idades.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)
}
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.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
. 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;
}
Muito obrigado @cami-la ! Ajudou bastante!
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....