Ordenar lista [ sort ]

opa!

galera tenho o seguinte objeto

List<ClienteBean> clientes = new ClienteDAO().getAll();

como faço para ordenar o objeto pelo nome do cliente

tentei dessa forma e não dá certo

List clientes = new ClienteDAO().getAll();
Collections.sort(clientes);

mas desse jeito dá erro no meu controller do JSF

abraço

Rapidamente, sua classe ClienteBean poderia implementar esta interface e as regras para ordenação:

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html

Ou vc pode criar um classe Comparable e usar o sort(list,comparable) :wink:

Simples:

Collections.sort(clientes , new Comparator<Cliente>() {
			public int compare(Cliente o1, Cliente o2) {
				return o1.getNome().compareTo(o2.getNome());
			}
		});

Qual das duas formas é mais “bonito” de ser feito?

Fazer o cliente implementar Comparable é meio desajeitado, porque você teria apenas uma forma de ordenar Clientes.

Eu voto por usar Comparator; você pode criar uma classe que implementa Comparator<Cliente>, se precisar reusar essa comparação em vários lugares. Em particular, você pode usar Collections.reverseOrder para reaproveitar a comparação se quiser simplesmente ordenar decrescentemente em vez de crescentemente.

beleza thingol

valeu pela dica, com esse link que você passou ficaria legal para um dataTable que possa ordenar por ondem inversa de cada campo né?

em falar nisso

é muito custoso popular um cliente e depois adiciona-lo na lista

um exemplo o cliente tem 15 propriedades, algumas delas objetos

se por exemplo tiver 1.000.000 de clientes no sistema

é bem ruim é fazer um getAll e fazer a paginação via ajax né

ou é tranquilo o fato para a JVM?

getAll de 1 milhão de objetos provavelmente irá estourar a memória da JVM.

Nestes casos:

-Ordene os registros durante a seleção no banco de dados.
-Crie um índice no banco sobre a mesma chave da ordenação.
-Use paginação, o teu cliente não vai querer ver 1 milhão de clientes de uma vez.
-Use um componente que faça a paginação por você, não implemente no braço.

[quote=Bruno Laturner]getAll de 1 milhão de objetos provavelmente irá estourar a memória da JVM.

Nestes casos:

-Ordene os registros durante a seleção no banco de dados.
-Crie um índice no banco sobre a mesma chave da ordenação.
-Use paginação, o teu cliente não vai querer ver 1 milhão de clientes de uma vez.
-Use um componente que faça a paginação por você, não implemente no braço.[/quote]

Eu exagerei um pouquinho

para JSF sabe algum componente, pois sempre que fiz foi na raça!

abraço

[quote=paulofernandesjr]
Eu exagerei um pouquinho

para JSF sabe algum componente, pois sempre que fiz foi na raça!

abraço[/quote]

Qualquer bom Datatable faz isso, basta um bom DataModel e MBean por trás:

http://wiki.apache.org/myfaces/WorkingWithLargeTables

http://www.guj.com.br/posts/list/16342.java

Edit: Se conseguir, poste aqui para a gente ver o resultado, muita gente agradece.

assim que conseguir fazer, voltarei ao post…

agora tem um outro negocio

devido a minha ordenacao, os dados estão vindo repetidos

como poderia fazer na não se repetirem,

exemplo

não quero que os clientes com o mesmo cpf apareçam duas vezes.

PS: eles estãpo em tabelas separadas no BD devido a uma questão de negocio

[quote=paulofernandesjr]devido a minha ordenacao, os dados estão vindo repetidos

como poderia fazer na não se repetirem[/quote]

Use a interface Set da API de Collections, e implemente o objeto a ser comparado com a interface Comparable. Está tudo no Javadoc do Set.