Comparator Example

voltar

Abaixo se encontra a classe pessoa que define uma ordem natural através da interface Comparable.

public class Pessoa implements Comparable<Pessoa> {

private Integer idade;

private String nome;

public Pessoa(String nome, int idade) {

this.idade = idade;

this.nome = nome;

}

@Override

public String toString() {

return this.getNome() + ” – ” + this.idade + ” anos”;

}

public Integer getIdade() {

return this.idade;

}

public String getNome() {

return this.nome;

}

// Define a ordem natural

@Override

public int compareTo(Pessoa o) {

if (this.idade.compareTo(o.idade) == 0) {

return this.nome.compareTo(o.nome);

} else

return this.idade.compareTo(o.idade);

}

}

Acontece que não queremos apenas ordenar a coleção pela ordem natural implementada na classe Pessoa, mas também gostariamos de especificar dinamicamente o nosso critério de ordenação. Por isso abaixo são declaradas três novas classes que implementam a interface Comparator. Em cada uma destas três classes é implementado uma nova regra para a ordenação dos elementos do tipo Pessoa contidos em uma coleção. Segue:

import java.util.Comparator;

public class PessoaSortIdade implements Comparator<Pessoa>{

@Override

public int compare(Pessoa o1, Pessoa o2) {

return o1.getIdade().compareTo(o2.getIdade());

}

}

import java.util.Comparator;

public class PessoaSortNome implements Comparator<Pessoa>{

@Override

public int compare(Pessoa o1, Pessoa o2) {

return o1.getNome().compareTo(o2.getNome());

}

}

import java.util.Comparator;

public class PessoaSort implements Comparator<Pessoa>{

@Override

public int compare(Pessoa o1, Pessoa o2) {

return o1.compareTo(o2);

}

}

Abaixo segue o teste realizado. Uma observação interessante é que as três classes logo acima (PessoaSortIdade, PessoaSortNome e PessoaSort) poderiam ser codificadas e instanciadas como classes anônimas no próprio método Collections.Sort.

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

public class TestPessoa {

public static void main(String[] args) {

List<Pessoa> lst = new ArrayList<Pessoa>();

// Carregamento dos dados

lst.add(new Pessoa(“Pedro”,34));

lst.add(new Pessoa(“Jose”,66));

lst.add(new Pessoa(“Juliane”,32));

lst.add(new Pessoa(“Flavia”,32));

lst.add(new Pessoa(“Lorena”,1));

lst.add(new Pessoa(“Lucia”,58));

lst.add(new Pessoa(“Henrique”,5));

System.out.println(“PRINTANDO ARRAY SEM ORDEM … DO JEITO QUE FOI INSERIDO”);

printArray(lst);

System.out.println();

System.out.println(“ORDENANDO POR IDADE”);

// mudando dinamicamente a lógica de ordenação dos objetos contidos na coleção

Collections.sort(lst, new PessoaSortIdade());

printArray(lst);

System.out.println();

System.out.println(“ORDENANDO POR NOME”);

// mudando dinamicamente a lógica de ordenação dos objetos contidos na coleção

Collections.sort(lst, new PessoaSortNome());

printArray(lst);

System.out.println();

System.out.println(“ORDENANDO PELA ORDEM NATURAL DEFINIDA NO OBJETO PESSOA”);

// mudando dinamicamente a lógica de ordenação dos objetos contidos na coleção

Collections.sort(lst, new PessoaSort());

printArray(lst);

}

public static void printArray(List<Pessoa> lst){

for (Pessoa pessoa : lst) {

System.out.println(pessoa);

}

}

}

Output:

PRINTANDO ARRAY SEM ORDEM … DO JEITO QUE FOI INSERIDO

Pedro – 34 anos

Jose – 66 anos

Juliane – 32 anos

Flavia – 32 anos

Lorena – 1 anos

Lucia – 58 anos

Henrique – 5 anos

ORDENANDO POR IDADE

Lorena – 1 anos

Henrique – 5 anos

Juliane – 32 anos

Flavia – 32 anos

Pedro – 34 anos

Lucia – 58 anos

Jose – 66 anos

ORDENANDO POR NOME

Flavia – 32 anos

Henrique – 5 anos

Jose – 66 anos

Juliane – 32 anos

Lorena – 1 anos

Lucia – 58 anos

Pedro – 34 anos

ORDENANDO PELA ORDEM NATURAL DEFINIDA NO OBJETO PESSOA

Lorena – 1 anos

Henrique – 5 anos

Flavia – 32 anos

Juliane – 32 anos

Pedro – 34 anos

Lucia – 58 anos

Jose – 66 anos

Poderiamos não utilizar da classe PessoaSort já que a própria classe pessoa implementa a interface Comparable.

System.out.println();

System.out.println(“ORDENANDO PELA ORDEM NATURAL DEFINIDA NO OBJETO PESSOA”);

// mudando dinamicamente a lógica de ordenação dos objetos contidos na coleção

Collections.sort(lst, new PessoaSort()); –> Collections.sort(lst);

printArray(lst);

Esta entrada foi publicada em Arrays & Colletions com as etiquetas . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s