sábado, 21 de maio de 2011

Classificando Lista com Comparable

Nesse post mostrarei como classificar uma Collection (organizar em ordem alfabetica, etc).

Vamos começar com algo facíl, organizar uma lista de Strings, para isso a classe java.util.Collections nos fornece o método sort();



public class Teste {
public static void main(String[] args) {
List<String> nomes = new ArrayList<String>();
nomes.add("Zeca");
nomes.add("Cristiano");
nomes.add("Adriana");
nomes.add("Joao");
System.out.println("Não classificado: " + nomes);
Collections.sort(nomes);
System.out.println("Classificado: " + nomes);
}
}

Iremos ter como retorno


Não classificado: [Zeca, Cristiano, Adriana, Joao]
Classificado: [Adriana, Cristiano, Joao, Zeca]

Agora vamos começar a complicar um pouco.
Queremos classificar uma lista de Objectos de Clientes, pelo nome por exemple.

public class Cliente {
private String nome;
private Integer idade;

       //Getters e Setters
}

Se fizermos como fizemos com String teremos erro de compilação

public class Teste {
public static void main(String[] args) {
List<Cliente> clientes = new ArrayList<Cliente>();
Cliente c1 = new Cliente();
c1.setNome("Zeca");
c1.setIdade(24);
clientes.add(c1);
Cliente c2 = new Cliente();
c2.setNome("Cristiano");
c2.setIdade(22);
clientes.add(c2);
Cliente c3 = new Cliente();
c3.setNome("Joao");
c3.setIdade(43);
clientes.add(c3);
                Collections.sort(clientes);        //ERRO DE COMPILAÇÃO

}

Porque isso acontece?
Se você ler o método sort(), você vai ver que a Collection (no nosso caso o Cliente) deve implementar a interface comparable, a String implementa o comparable por isso conseguimos utilizar o sort() com ele, então é simples se você quer utilizar o sort() com o Cliente basta implementar o comparable na classe Cliente, vou mostrar como fazer isso.

public class Cliente implements Comparable<Cliente>{
private String nome;
private Integer idade;

        //Getters e Setters

       @Override
public int compareTo(Cliente o) {
return nome.compareTo(o.getNome());
}
}

Ao implementar o comparable devemos implementar na classe o método compareTo(), com isso estamos classificando nossa lista por nome (poderíamos fazer também com idade sem problemas). Agora podemos utilizar o Collections.sort(clientes) sem problemas que não teremos nenhum erro de compilação. Vou mostrar como fazer e como fica e ainda como fazer em ordem decrescente, basta utilizar o Cllections.reverse(clientes).

public class Teste {
public static void main(String[] args) {
List<Cliente> clientes = new ArrayList<Cliente>();
Cliente c1 = new Cliente();
c1.setNome("Zeca");
c1.setIdade(24);
clientes.add(c1);
Cliente c2 = new Cliente();
c2.setNome("Cristiano");
c2.setIdade(22);
clientes.add(c2);
Cliente c3 = new Cliente();
c3.setNome("Joao");
c3.setIdade(43);
clientes.add(c3);
System.out.println("---------\nNão Ordernado\n---------");
for (Cliente c : clientes) {
System.out.println("Nome: " + c.getNome());
System.out.println("Idade: " + c.getIdade());
}
System.out.println("---------\nOrdernado\n---------");
Collections.sort(clientes);
for (Cliente c : clientes) {
System.out.println("Nome: " + c.getNome());
System.out.println("Idade: " + c.getIdade());
}
                System.out.println("---------\nOrdernado Decrescente\n---------");
Collections.sort(clientes);
Collections.reverse(clientes);
for (Cliente c : clientes) {
System.out.println("Nome: " + c.getNome());
System.out.println("Idade: " + c.getIdade());
}

}
}

Teremos como resultado.

---------
Não Ordernado
---------
Nome: Zeca
Idade: 24
Nome: Cristiano
Idade: 22
Nome: Joao
Idade: 43
---------
Ordernado
---------
Nome: Cristiano
Idade: 22
Nome: Joao
Idade: 43
Nome: Zeca
Idade: 24
---------
Ordernado Decrescente
---------
Nome: Zeca
Idade: 24
Nome: Joao
Idade: 43
Nome: Cristiano
Idade: 22


No próximo post irei mostrar o Comparator e as diferenças entre Comparator e Comparable


Nenhum comentário:

Postar um comentário