Ordenando uma lista de objetos em Java

(Última atualização em: 30 de maio de 2017)

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? Deixe seu comentário! Aproveite também e dê uma olhada no nosso curso de Java: Dominando as Collections que tem o foco de apresentar, de uma forma mais completa, o uso das Collections em geral no mundo Java, bacana né? 😉

Content Editor at Alura and Software Developer

  • Francini

    Boa tarde, tudo bom?

    Ao imprimir esse código no Eclipse aparece o nome da classe e a referência de onde esta alocado o objeto.
    desta forma [Aluno@15db9742, Aluno@6d06d69c, Aluno@7852e922, Aluno@4e25154f];

    Pode me ajudar por favor?

    • Olá Francini, tudo bem?

      Nesse caso, o que aconteceu é o seguinte, quando imprimimos objetos no Java, ele, por padrão, imprime esse código estranho, também conhecido por hashcode. Para personalizar a impressão de um objeto, precisamos sobrescrever o método toString().

      No exemplo acima, eu utilizei o seguinte toString() para 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;
      	}
      
      	@Override
      	public String toString() {
      		return nome + " - " + pontos;
      	}
      
      }
      

      Tente adicionar esse toString() e veja o resultado. Lembrando que você pode modificá-lo como desejar. Faça os testes e me diga como foi o resultado. 😉

Próximo ArtigoO que é encapsulamento?