Ordenando uma lista de objetos em Java

Ordenando uma lista de objetos em Java

Concluindo mais um curso eu irei alcançar o top 3 do Alura!


Guilherme Silveira - 23.143. 
Maurício Aniche - 19.930. 
Rodrigo Turini - 13.500. 
Alex Felipe - 13.450.

Para computar as informações dos pontos usamos a classe Aluno:

Banner da Escola de Programação: Matricula-se na escola de Programação. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

public class Aluno {

private final String nome; 
private int pontos;

public Aluno(String nome, int pontos) { 
 this.nome = nome;
 this.pontos = pontos; 
}

//métodos

}

Então vamos criar nossos alunos:


Aluno aluno1 = new Aluno("Alex Felipe", 13450); 
Aluno aluno2 = new Aluno("Maurício Aniche", 19930); 
Aluno aluno3 = new Aluno("Guilherme Silveira", 23143); 
Aluno aluno4 = new Aluno("Rodrigo Turini", 13500);

Agora precisamos de uma List para armazenar esses alunos:


List<Aluno> alunos = new ArrayList<Aluno>();

alunos.add(aluno1); 
alunos.add(aluno2); 
alunos.add(aluno3); 
alunos.add(aluno4);

Testando a nossa lista:


System.out.println(alunos);

Resultado:

 \[Alex Felipe - 13450, Maurício Aniche - 19930, Guilherme Silveira - 23143, Rodrigo Turini - 13500\]

Pronto! Tenho minha List com os alunos. Agora vamos ordenar com o método estático sort() da classe Collections():


Collections.sort(alunos);

Espere um pouco... O meu código não compila!? O problema é que o método sort() não sabe como ordenar um aluno, ou seja, ele não sabe qual parâmetro ou critério deve usar para comparar alunos. Porém, nós podemos informá-lo implementando a interface Comparable na classe Aluno:


public class Aluno implements Comparable<Aluno>{

//atributos e métodos

@Override public int compareTo(Aluno outroAluno) { //implementação }

}

Quando implementamos a interface Comparable, precisamos preencher o campo do generics_ com o tipo de objeto que queremos comparar, nesse caso queremos comparar com Aluno mesmo. Por fim, precisamos implementar o método compareTo().

A regra de ordenação usando o método compareTo() compara dois objetos (alunos) e funciona da seguinte maneira:

  • Para alocar o aluno mais a esquerda da lista, retornamos -1.
  • Para alocar o aluno mais a direita da lista, retornamos 1.
  • quando retornamos 0 significa que os alunos comparados são iguais e não alteram suas posições.

No nosso exemplo:


@Override public int compareTo(Aluno outroAluno) { 
if (this.pontos > outroAluno.getPontos()) { 
  return -1; 
  } if (this.pontos < outroAluno.getPontos()) { 
  return 1; 
  } 
  return 0; 
 }

Estamos indicando que se os pontos do aluno forem maior, mande ele mais para esquerda (-1), se for menor, mande para a direita (1) e se os alunos forem iguais não faça nada (0).

Após a implementação do Comparable, o nosso código compila! Vamos testá-lo:


Collections.sort(alunos); System.out.println(alunos);

Resultado:

[Guilherme Silveira - 23143, Maurício Aniche - 19930, Rodrigo Turini - 13500, Alex Felipe - 13450]

Veja que agora os nossos alunos estão ordenados!

Diferente da ordenação de números, para ordenar lista de objetos específicos, como é o caso do objeto aluno, é necessário informar como o objeto precisa ser ordenado implementando a interface Comparable e implementando o seu método compareTo(). Há um post da Caelum que explica com mais detalhes essa e outras formas de ordenação de coleções.

O que achou da técnica para ordenar uma lista em Java? Dê uma olhada na nossa Formação Java que tem o foco de apresentar em geral o mundo Java, bacana né? ;)

Alex Felipe
Alex Felipe

Alex é instrutor e desenvolvedor e possui experiência em Java, Kotlin, Android. Atualmente cria conteúdo no canal https://www.youtube.com/@AlexFelipeDev.

Veja outros artigos sobre Programação