28 de abr de 2010

Boas práticas de programação 3 - Java Collections Framework

Collections - Classe Java para Manipular Listas.

Se você estava a procura de uma forma rápida de ordenar listas, embaralhá-las, entre outras coisas, esta é a classe.
Ela pode manipular várias Interfaces do java, como:
  • Set
  • List
  • Map
  • SortedSet
  • entre outras.

A classe Collections oferece vários métodos que são de bastante utilidade. Confira:

  • sort(List) - ordena uma lista usando o algoritmo merge sort, o qual provê uma performance média comparado com o algoritmo quicksort, mas garantindo performance de [n*log n] (diferente do quicksort), e estabilidade (diferente do quicksort).

obs.: Você deve implementar a Inteface Comparable. Mas como eu faço isso? Simples. Veja ai!

Vamos supor que você tenha uma classe Produto com essa cara:

public class Produto {

private Integer id;
private String descricao;
private Double preco;
private Long codigoBarra;

// getters and setters ...
}


Para que o Collections.sort(List) ordene o Produto pela descricao, por exemplo, primeiro implemete a Interface Comparable.
E implemente o método compareTo(Object).

public class Produto implements Comparable {

// continua o mesmo acima ...
@Override
public int compareTo(String value) {
return this.descricao.compareTo(value);
}
}


Mas por que isso deve ser feito? Bom, primeiro pois o sort ordena seus elementos a partir do resultado que retorna o compareTo(Object). Esse método tem por função retornar números inteiros negativos(não necessariamente -1), positivos (não necessariamente 1) ou zero.
Dica: se você tiver uma List de String, por exemplo, não é necessário implementar o compareTo, pois esse trabalho já foi feito pelos desenvolvedores da Sun. Isso vale para as várias classes conhecidas como Integer, Long, Double, etc.

Bom, o próximo passo é chamar o método:

public class ProdutoDao {

// atributos e construtor ...

public List findAll() {

List list = new ArrayList();
// conexão com o banco e a query ...
while (rs.next()) {
// Pegue os dados do ResultSet e adicione na lista
list.add(produto);
}
Collections.sort(list);
return list;
}
}


  • reverse(List) - Reverte a ordem dos elementos na lista.

Vamos supor a seguinte situação: Você quer os elementos de uma lista ordenados de forma decrescente. Bem, agora
que você já aprendeu a ordenar de forma crescente, basta chamar o sort(List) e depois o reverse(List).

public List findAll() {

List list = new ArrayList();
// conexão com o banco e a query ...
while (rs.next()) {
Produto produto = new Produto();
// Pegue os dados do ResultSet e adicione na lista
list.add(produto);
}
Collections.sort(list);
Collections.reverse(list);
return list;
}


  • swap(List, int, int) - Troca elementos da List a partir do índice.

Útil quando necessário algum tipo de prioridade de certo elemento, basta achá-lo e trocar de lugar com outro
usando o método swap.

// ...
Collections.swap(list, 3, 1);
// ...


No caso o elemento 3 da list foi para a primeira posição e o 1 foi para a terceira posição.

  • shuffle(List) - permuta randomicamente uma lista usando um código randômico padrão.

É ideal quando você precisa embaralhar, por exemplo, uma lista de cartas de uma baralho.

// ...
Collections.shuffle(list);
// ...


Para mais informações sobre Java Collections Framework visite: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html