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>{
@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>{
<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> 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