Translate

sábado, 12 de abril de 2014

Java - Ordenando Listas de Objetos (Object Sort) II - Utilizando Comparator

Nos post anterior falamos de como ordenar objetos em uma lista a partir de um atributo do mesmo. 

Mas e se quisermos permitir diversas formas de se ordenar um objeto?

Para tal, utilizamos a interface Comparator.

Aproveitaremos a mesma classe Pessoa já criada no post anterior  e implementaremos classes internas à mesma. 

Vamos criar modos para ordenar por Sobrenome e por Nome. 

Abaixo a classe interna (inner class) para ordenação por Nome, que deverá ser inserida dentro da classe Pessoa:


  
    /**
     * Classe interna que ordena Pessoa pelo atributo Nome
     */
    public static class OrdenarPorNome implements Comparator<Pessoa>{

        @Override
        public int compare(Pessoa o1, Pessoa o2) {
            
         return o1.getNome().compareTo(o2.getNome());
         
        }
        
    }

Vamos aproveitar e criar outra classe interna (inner class) para ordenação por Sobrenome, que também deverá ser inserida dentro da classe Pessoa:
    /**
     * Classe interna que ordena Pessoa pelo atributo Sobrenome
     */
    public static class OrdenarPorSobrenome implements Comparator<Pessoa>{

        @Override
        public int compare(Pessoa o1, Pessoa o2) {
            
         return o1.getSobreNome().compareTo(o2.getSobreNome());
         
        }
        
    }

Assim, a classe Pessoa deve ficar da seguinte forma, já com a adição das classes internas: 



package br.com.devfacil.model;

import java.util.Comparator;

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 Descrescente
         */
        return idadeComparacao - this.idade;
    }

    
    /**
     * Classe interna que ordena Pessoa pelo atributo Nome
     */
    public static class OrdenarPorNome implements Comparator<Pessoa>{

        @Override
        public int compare(Pessoa o1, Pessoa o2) {
            
         return o1.getNome().compareTo(o2.getNome());
         
        }
        
    }
    
    /**
     * Classe interna que ordena Pessoa pelo atributo Sobrenome
     */
    public static class OrdenarPorSobrenome implements Comparator<Pessoa>{

        @Override
        public int compare(Pessoa o1, Pessoa o2) {
            
         return o1.getSobreNome().compareTo(o2.getSobreNome());
         
        }
        
    }
    
}

Vamos modificar agora a classe principal, e a chamada do método Collections.sort() já descrita no post anterior , desta vez, vamos incluir a chamada para as classes internas, como parâmetro do método, conforme o trecho abaixo: 
 

        /**
         *  Ordena por nome
         */
        Collections.sort(listaPessoas, new Pessoa.OrdenarPorNome());


Abaixo, a classe principal do post anterior, já com a adição da chamada para ordenação por nome e sobrenome: 



 
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("Ana", "Dias", 40));
        listaPessoas.add(new Pessoa("Pedro", "Serafim", 30));
        listaPessoas.add(new Pessoa("Maria", "Cavalcante", 58));
        listaPessoas.add(new Pessoa("Beatriz", "Silva", 27));

        /**
         *  Ordena por nome
         */
        Collections.sort(listaPessoas, new Pessoa.OrdenarPorNome());

        System.out.println("\n Lista Ordenada por Nome:");
        for (Pessoa p : listaPessoas) {

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

        }
        
        /**
         *  Ordena por Sobrenome
         */
        Collections.sort(listaPessoas, new Pessoa.OrdenarPorSobrenome());
        
          System.out.println("\n Lista Ordenada por Sobrenome:");
        for (Pessoa p : listaPessoas) {

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

        }
    }
}

A saída exibida deverá ser esta:

 


 Lista Ordenada por Nome:
Nome: Ana, Sobrenome: Dias, Idade: 40
Nome: Beatriz, Sobrenome: Silva, Idade: 27
Nome: Maria, Sobrenome: Cavalcante, Idade: 58
Nome: Pedro, Sobrenome: Serafim, Idade: 30

 Lista Ordenada por Sobrenome:
Nome: Maria, Sobrenome: Cavalcante, Idade: 58
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