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) < 0) {
return -1;
} else if (this.nome.compareTo(cidade.nome) > 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
![](https://www.guj.com.br/uploads/default/original/3X/5/b/5b0e73e5d72f8fb73472b453b7eb3adf65b38dc4.jpg)
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: :wink:](https://www.guj.com.br/images/emoji/twitter/wink.png?v=9)
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.