Problema na ordenação com List

Caro amigo.
Estout endo um pequeno problema para ordenar alfabeticamente a minha classe Cidade.
O seguinte código foi implementado por mim:

public List<Cidade> getMunicipios(Long filiadoAssociadoId) {
FiliadoAssociado filiadoAssociado = (FiliadoAssociado) createCriteria(FiliadoAssociado.class).add(Restrictions.eq(“id”, filiadoAssociadoId)).uniqueResult();
List<Cidade> cidades = new ArrayList();

if (filiadoAssociado.getExtensoesDeBase() != null) {
cidades.addAll(filiadoAssociado.getExtensoesDeBase());
}
cidades.add(filiadoAssociado.getEndereco().getCidade());
Collections.sort(cidades);

return cidades;
}

O resultado sendo visto num select em HTML é justamente o incorreto, ou seja, não houve a ordenação correta.

Na classe Cidade.java esta implementado Comparable<Cidade> e também o método compareTo da seguinte forma:

public int compareTo(Cidade cidade) {
/*
if (this.nome.compareTo(cidade.nome) &lt 0) {
return -1;
} else if (this.nome.compareTo(cidade.nome) &gt 0) {
return 1;
} else {
return 0;
}
*/
return this.nome.compareTo(cidade.nome);
}

O que devo fazer para ter o resultado correto ?
Deveria utilizar o SortedSet + TreeSet ao invéz do List + ArrayList ?

Muito grato,

Dennys

Olha, o SortedSet + TreeSet deve funcionar, mas o que você fez também deveria estar funcionando.

Só tome um cuidado, como são cidades brasileiras, não use diretamente o compareTo do String para comparar. Use um Collator. Assim mesmo cidades com acentos ficarão na ordem correta. :wink:

public int compareTo(Cidade cidade) { return Collator.getInstance().compare(this.nome, cidade.nome); }

Ola abaixa existe uma forma de como vc pode esta ordenando sua list, não sei se é a melhor, mas funciona.

package teste;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Teste {

[b]public static void ordenarLis[/b]t(List listaCidades){
	//Interface utilizada junto a Collections para ordenar elementos de uma list.
	Comparator comp = new Comparator(){

		//Método responsavel pela comparação implementada pelo desenvolvedor para ordenar a list.
		public int compare(Object o1, Object o2) {
			
			//Obtem os dois objtos a serem comparados.
			Cidade cid1 = (Cidade) o1;
			Cidade cid2 = (Cidade) o2;
			
			//Obtem os nomes das cidades a serem comparadas, para ordenação.
			String str1 = cid1.getDescricao();
			String str2 = cid2.getDescricao();
			
			//compara as duas os nomes das cidades determinando se a primeira possui o valor maior 
			//que a segunda.
			return str1.compareToIgnoreCase(str2);
		}
	};
	//Efetua a ordenação da list de cidades.
	Collections.sort(listaCidades, comp);
}

[b]public static void imprimirResultadoListOrdenada[/b](List<Cidade> listaCidades){
	for (Cidade cidade : listaCidades) {
		System.out.println(cidade.getDescricao());
	}
}

[b]public static List<Cidade> montarListaCidade[/b](){
	List<Cidade> listCidades = new ArrayList();
	
	listCidades.add( getCidade(1, "Meriapolis"));
	listCidades.add( getCidade(1, "Adamantina"));
	listCidades.add( getCidade(1, "Areias"));
	
	return listCidades;
}

[b]protected static Cidade getCidade[/b](int id, String descricao){
	Cidade cidade = new Cidade();
	cidade.setId(id);
	cidade.setDescricao(descricao);
	
	return cidade;
}

[b]public static void main[/b](String[] args) {
	List<Cidade> listaCidades = montarListaCidade();
	ordenarList(listaCidades);
	imprimirResultadoListOrdenada(listaCidades);
}

}

class Cidade{

private int id;
private String descricao;

public String getDescricao() {
	return descricao;
}
public void setDescricao(String descricao) {
	this.descricao = descricao;
}
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}

}

Olá amigo, não sei se pode lhe ajudar mas caso queira, tente mudar seu metodo:
“public int compareTo(Cidade cidade){}”, para
“public int compareTo(Object cidade){}”, e dentro do “compareTo”, so verificar se esta recebendo uma instancia de “Cidade”, antes de verificar a ordem de prioridade.

Mudar o tipo não vai adiantar, porque ele usa um Comparable<Cidade>.

O problema com certeza não é o uso dos Generics… nisso poderia apostar…

Bom pessoal, fiz a implementação no método compareTo da seguinte forma:

	public int compareTo(Cidade cidade) {
		return this.nome.compareToIgnoreCase(cidade.nome);
	}

E modifiquei o meu GetMunicipios para:

	public SortedSet<Cidade> getMunicipios(Long filiadoAssociadoId) {
		FiliadoAssociado filiadoAssociado 	= (FiliadoAssociado) createCriteria(FiliadoAssociado.class).add(Restrictions.eq("id", filiadoAssociadoId)).uniqueResult();
		SortedSet<Cidade> cidades 			= new TreeSet();

		if (filiadoAssociado.getExtensoesDeBase() != null) {
			cidades.addAll(filiadoAssociado.getExtensoesDeBase());
		}
		cidades.add(filiadoAssociado.getEndereco().getCidade());
		System.out.println(cidades);

		return cidades;
	}

Com o breakpoint fui depurar o resultado e percebi que a ordenação esta correta, vejam:

[Id: 94, Nome: ADAMANTINA , Id: 1, Nome: AREIAS , Id: 215, Nome: MARIAPOLIS ]

Mas ao ser apresentado no select HTML o seguinte resultado esta sendo apresentado:

AREIAS
ADAMANTINA
MARIAPOLIS

O que pode esta dando de errado, coisa bizarra.
Não tenho nada de excepcional no código HTML.

Pessoal já encontrei o problema…
Eram métodos duplicados (bobeira minha) desculpem!

Desde já agradeço todas as dicas e conselhos.