Translate

sexta-feira, 11 de abril de 2014

Java - Ordenando Listas de Objetos (Object Sort)

No post anterior, falamos de ordenação de listas, e ordenamos alfabeticamente uma lista de nomes. 

A ordenação alfabética é simples e intuitiva para qualquer leitor, porém, e quando queremos ordenar objetos, que nós mesmos criamos dentro do código? 

Quando queremos ordenar esta lista de objetos, segundo regras criadas por nós mesmos?

Neste breve tutorial, vamos exemplificar o uso da interface Comparable e do metodo compareTo()

Começaremos criando a classe Pessoa possuindo como atributos, Nome, Sobrenome e Idade:



package br.com.devfacil.model;

public class Pessoa {

    private String nome;
    private String sobreNome;
    private Integer idade;

    public Pessoa(String nome, String sobreNome, Integer idade) {
        this.nome = nome;
        this.sobreNome = sobreNome;
        this.idade = idade;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSobreNome() {
        return sobreNome;
    }

    public void setSobreNome(String sobreNome) {
        this.sobreNome = sobreNome;
    }

    public Integer getIdade() {
        return idade;
    }

    public void setIdade(Integer idade) {
        this.idade = idade;
    }

}

Feito isto criaremos nossa classe principal, com o metodo main(), que criará uma lista de Pessoa,  a preencherá e a ordenará, como no exemplo do post anterior




package br.com.devfacil.view;

import br.com.devfacil.model.Pessoa;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SortListMain {

    public static void main(String[] args) {

        /**
         * Cria lista de Pessoas
         */
        List<Pessoa> listaPessoas = new ArrayList<Pessoa>();

        /**
         * Atribui 'Nome', 'Sobrenome' e 'Idade' fazendo uso do contrutor com
         * parametros de Pessoa(String nome, String sobreNome, Integer idade);
         */
        listaPessoas.add(new Pessoa("João", "da Silva", 41));
        listaPessoas.add(new Pessoa("Ana", "Dias", 40));
        listaPessoas.add(new Pessoa("Pedro", "Serafim", 30));
        listaPessoas.add(new Pessoa("Maria", "Cavalcante", 58));
        listaPessoas.add(new Pessoa("Beatriz", "Silva", 27));

        Collections.sort(listaPessoas);

        for (Pessoa p : listaPessoas) {

            System.out.println("Nome: " + p.getNome() + ", Sobrenome: " + p.getSobreNome() + ", Idade: " + p.getIdade());

        }
    }
}
Note que na linha que tenta ordenar a lista Collections.sort(listaPessoas); o Java retorna um erro, falando, em linhas gerais, que não consegue ordenar uma lista de objetos do tipo Pessoa, porque não conhece os parâmetros de comparação necessários para ordenar os objetos; em outras palavras, a JVM não sabe se deve ordenar as pessoas da lista por nome, por sobrenome ou pela idade. 

Para solucionar este problema, nossa classe Pessoa deve implementar a interface Comparable, ou seja, 'ser comparável', e sobrescrever o metodo compareTo() da mesma, de modo que este possa determinar o que se deve levar em consideração para ordenar uma lista de pessoas. 

A nova classe Pessoa implementando Comparable é mostrada abaixo: 



package br.com.devfacil.model;

public class Pessoa implements Comparable<Pessoa>{

    private String nome;
    private String sobreNome;
    private Integer idade;

    public Pessoa(String nome, String sobreNome, Integer idade) {
        this.nome = nome;
        this.sobreNome = sobreNome;
        this.idade = idade;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSobreNome() {
        return sobreNome;
    }

    public void setSobreNome(String sobreNome) {
        this.sobreNome = sobreNome;
    }

    public Integer getIdade() {
        return idade;
    }

    public void setIdade(Integer idade) {
        this.idade = idade;
    }

    @Override
    public int compareTo(Pessoa pessoaComparacao) {
        
      int idadeComparacao = ((Pessoa) pessoaComparacao).getIdade();
      
      /**
       * Ordena as idades de forma Crescente
       */
      return this.idade - idadeComparacao; 
    }

}
Note que o método compareTo() recebe um objeto pessoa e compara o atributo idade, dos objetos.  

Ao executar o metodo main() da classe principal novamente, o erro desaparece, e a saída do programa é a seguinte: 


Nome: Beatriz, Sobrenome: Silva, Idade: 27
Nome: Pedro, Sobrenome: Serafim, Idade: 30
Nome: Ana, Sobrenome: Dias, Idade: 40
Nome: João, Sobrenome: da Silva, Idade: 41
Nome: Maria, Sobrenome: Cavalcante, Idade: 58

As pessoas da lista estão ordenadas com a idade em valores crescentes.

Como exemplo, podemos alterar o metodo compareTo() do objeto Pessoa, de modo a obtermos a ordenação em forma decrescente: 


 @Override
    public int compareTo(Pessoa pessoaComparacao) {

        int idadeComparacao = ((Pessoa) pessoaComparacao).getIdade();

        /**
         * Ordena as idades de forma Descrescente
         */
        return idadeComparacao - this.idade;
    }

O resultado apresentado na tela é este: 



Nome: Maria, Sobrenome: Cavalcante, Idade: 58
Nome: João, Sobrenome: da Silva, Idade: 41
Nome: Ana, Sobrenome: Dias, Idade: 40
Nome: Pedro, Sobrenome: Serafim, Idade: 30
Nome: Beatriz, Sobrenome: Silva, Idade: 27

Nenhum comentário:

Postar um comentário