Ordenando uma lista de objetos em Java

Ordenando uma lista de objetos em Java
Alex Felipe Victor Vieira
Alex Felipe Victor Vieira

Compartilhe

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:


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 Victor Vieira
Alex Felipe Victor Vieira

Alex é instrutor e desenvolvedor e possui experiência em Java, Kotlin, Android. Criador de mais de 40 cursos, como Kotlin, Flutter, Android, persistência de dados, comunicação com Web API, personalização de telas, testes automatizados, arquitetura de Apps e Firebase. É expert em Programação Orientada a Objetos, visando sempre compartilhar as boas práticas e tendências do mercado de desenvolvimento de software. Atuou 2 anos como editor de conteúdo no blog da Alura e hoje ainda escreve artigos técnicos.

Veja outros artigos sobre Programação