[Resolvido!] List<SelectItem> em ordem alfabética: é possível?

15 respostas
Kleber-rr

Olá pessoal, bom dia.

Gostaria de saber como ordenar a minha lista de selectItem em ordem alfabética.

Meu método está assim:
public List<SelectItem> getMunicipiosRRParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		MunicipiosRRHandler handler = pegaMunicipiosRRHandler();
		for (MunicipiosRR m : handler.getListaMunicipiosRR()) {
			lista
					.add(new SelectItem(m.getCod_municipiosrr(), m
							.getMunicipios()));
		}
		return lista;
	}

Tentei o Order.asc (m.getMunicipios()) e nada, tentei o Collections.sort (lista) e não é aceito...
Sei que é coisa simples, mas ainda não encontrei solução.

A quem puder contribuir, agradeço.

Vlw.

15 Respostas

viniciusalvess

Collections.sort(List list);

OliveirakunJava

Para ordenar coleções, as classes a serem ordenadas devem implementar a interface comparable ou comparator. O artigo abaixo contém informações bem detalhadas do funcionamento dessas interfaces:
http://blog.caelum.com.br/?s=comparable

Kleber-rr

Não funciona… :frowning:

aajjbb
public List<SelectItem> getMunicipiosRRParaComboBox() {  
       List<SelectItem> lista = new ArrayList<SelectItem>();  
     
       MunicipiosRRHandler handler = pegaMunicipiosRRHandler();  
       for (MunicipiosRR m : handler.getListaMunicipiosRR()) {  
        lista.add(new SelectItem(m.getCod_municipiosrr(), m.getMunicipios()));  
       }  
       Collections.sort(lista);
        return lista;  
   }

mas o metodo sort organiza “Strings” em ordem alfabetica… ou sua lista aceita membros do tipo String ou voê implementa o compareTo para ordena-los em ordem alfabetica…

Her10

Bom cara o collections.sort(); deveria funcinar sim,

como o OliveirakunJava disse,

se estiver implementado o comparable ou comparator.

detalhe tem que ser usado na sua lista de Objetos e não na lista de SelectItens

ex: Collections.sort(handler.getListaMunicipiosRR);

e dpois add à lista. de SelectItems.

Kleber-rr

Olá pessoal, voltando ao assunto…

Tentei implementar o Collections.sort no meu método List do objeto MunicipiosRR dessa forma:

public List<MunicipiosRR> getListaMunicipiosRR() { System.out.println("Carregando a lista de municipios ..."); Session session = HibernateUtil.currentSession(); Dao<MunicipiosRR> dao = new Dao<MunicipiosRR>(session, MunicipiosRR.class); Collections.sort(dao.list()); return dao.list(); }

E ele marca o sort e mostra esse erro:

Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<MunicipiosRR>). The inferred type MunicipiosRR is not a valid substitute for the bounded parameter <T extends Comparable><? super T>>

No meu DAO, o método List está assim:

@SuppressWarnings("unchecked") public List<T> list() { logger.info("Listando todos"); return session.createCriteria(persistentClass).list(); }

Posso fazer a ordenação através do Collections.sort aqui no List do DAO genérico??

Obrigado.

Kanin_Dragon

OliveirakunJava:
Para ordenar coleções, as classes a serem ordenadas devem implementar a interface comparable ou comparator. O artigo abaixo contém informações bem detalhadas do funcionamento dessas interfaces:
http://blog.caelum.com.br/?s=comparable

O colega acima deu a solução, da uma olhada no artigo dele.

renamed

Kleber-rr:
Olá pessoal, voltando ao assunto…
E ele marca o sort e mostra esse erro:

Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<MunicipiosRR>). The inferred type MunicipiosRR is not a valid substitute for the bounded parameter <T extends Comparable><? super T>>

Sua classe MunicipiosRR precisa implementar a interface Comparable para utilizar essa assinatura do método sort.

leoramos

Se quiser simplificar, dá pra usar BeanComparator:
http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/BeanComparator.html
Inclusive se quiseres usar dinamicamente mais de um atributo, dá pra criar uma cadeia de comparadores (em duas, três linhas, coisa de chimpanzé de tão simples).
Sucesso aí, fera!

ViniGodoy

Para que o sort funcione, você precisa implementar um Comparator:

Ou o objeto precisa ser Comparable.

Kleber-rr

Kanin Dragon:
OliveirakunJava:
Para ordenar coleções, as classes a serem ordenadas devem implementar a interface comparable ou comparator. O artigo abaixo contém informações bem detalhadas do funcionamento dessas interfaces:
http://blog.caelum.com.br/?s=comparable

O colega acima deu a solução, da uma olhada no artigo dele.

Ok. estou olhando. Obrigado.

Kleber-rr

Pessoal, olhei o tutorial do comparable que o colega acima passou, mas estou com uma dúvida:
Tenho que implementar o Comparable no bean? Tentei implementar no bean e ficou assim:

public int compareTo(MunicipiosRRHandler municipios,
			MunicipiosRRHandler outro) {

		return municipios.municipiosrr.getMunicipios().compareTo(
				outro.municipiosrr.getMunicipios());
	}
O problema é que no nome da minha classe:
public class MunicipiosRRHandler implements Comparable<MunicipiosRRHandler>{
O nome da classe ficou grifado de vermelho, e me diz:
The type MunicipiosRRHandler must implement the inherited abstract method Comparable<MunicipiosRRHandler>.compareTo(MunicipiosRRHandler)
Ou seja, ele não está reconhecendo o método alterado acima...

O que estou fazendo errado??

Obrigado pela ajuda.

Kleber-rr
ViniGodoy:
Para que o sort funcione, você precisa implementar um Comparator: http://www.guj.com.br/java/45985-ordenamento-de-vetores#241201

Ou o objeto precisa ser Comparable.

Blz Vini, obrigado por responder.

Implementei o Comparator na CLasse MunicipiosRR, e ficou assim:
public class MunicipiosRR implements Comparator<MunicipiosRR> {
//...
	@Override
	public int compare(MunicipiosRR municipios, MunicipiosRR outro) {

		return municipios.getMunicipios().compareTo(outro.getMunicipios());
	}
E no Bean ficou assim:
public List<MunicipiosRR> getListaMunicipiosRR() {
		System.out.println("Carregando a lista de municipios ...");
		Session session = HibernateUtil.currentSession();
		Dao<MunicipiosRR> dao = new Dao<MunicipiosRR>(session,
				MunicipiosRR.class);
		Collections.sort(dao.list(), new MunicipiosRR());
		return dao.list();
	}

Vou testar, depois posto o resultado.

Vlw.

Kleber-rr

Pessoal, não ordenou…
O que pode estar errado??

Kleber-rr

Blz pessoal, resolvi.

Apenas corrigi o retorno da lista no meu método List. Ficou assim:

public List<MunicipiosRR> getListaMunicipiosRR() { System.out.println("Carregando a lista de municipios ..."); Session session = HibernateUtil.currentSession(); Dao<MunicipiosRR> dao = new Dao<MunicipiosRR>(session, MunicipiosRR.class); List<MunicipiosRR> list = dao.list(); Collections.sort(list, municipiosrr); return list; }

Obrigado a todos, principalmente ao ViniGodoy e ao OliveirakunJava.
Abs.

Criado 9 de dezembro de 2010
Ultima resposta 28 de fev. de 2011
Respostas 15
Participantes 9