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>{
Vamos aproveitar e criar outra classe interna (inner class) para ordenação por Sobrenome, que também deverá ser inserida dentro da classe 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>Assim, a classe Pessoa deve ficar da seguinte forma, já com a adição das classes internas:{ @Override public int compare(Pessoa o1, Pessoa o2) { return o1.getSobreNome().compareTo(o2.getSobreNome()); } }
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>{
<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
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:@Override public int compare(Pessoa o1, Pessoa o2) { return o1.getSobreNome().compareTo(o2.getSobreNome()); } } }
/** * 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>A saída exibida deverá ser esta: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()); } } }
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