Pessoal eu tenho uma classe entidade que quero inserir em um TreeSet para deixa-las organizadas em order crescente. Bom, nessa classe eu já substituí o toString() e o equals() e quando eu tento inserir essa classe em uma coleção TreeSet dá erro de Cast, o que pode estar havendo?
TreeSet requer que o objeto seja uma instância de uma classe que implemente Comparable. No seu caso, supondo que sua TreeSet fique ordenada pela ordem crescente de ID, e se duas Telas tiverem o mesmo ID, que sejam ordenadas então por nome, e que você não tenha nenhum elemento cujo id seja null ou nome seja null:
EDIT - esqueci de pôr “implements Comparable” :oops:
vc deve, ao invés de sobrescrever o equals, implementar a interface Comparable com seu método compareTo:
public int compareTo(Object o) {
return id.compareTo(((Tela) o).getId());
}
H
hlhaas
Humm… Legal ! Obrigado Amigo!
H
hlhaas
Agora que deu certo fazer a ordem crescente preciso fazer a order decrescente…
T
thingol
Você inverte o sinal - se compareTo retorna +1, você pondo o sinal de - vai retornar -1. Só que como uma classe não pode implementar Comparable duas vezes, você precisa criar uma classe auxiliar que implementa Comparator e passar uma instância dessa classe para o TreeSet no seu construtor.
Ele funciona uma exceção quando eu tenho um nome com ascentuação ele coloca esse nome na última posição, veja o exemplo da lista:
Unidade Federal
Logradouro Tipo
Logradouro
Bairro
País
nesse caso a palavra País deveria ser a primeira… o ocorre quando existe caracteres ascentuados em uma ordenação, como posso corrigir isso?
T
thingol
Hum - no meu alfabeto, a letra L vem antes da letra P e a letra P vem antes da letra U. Mas de qualquer maneira, existe o tal do Collator, que compara sem acentos.
H
hlhaas
Ops… País deverá vir depois Unidade Federal e antes de Logradouro Tipo.
Mas enfim… vou verificar o Collator!
Obrigado!
T
thingol
Eis um exemplo de como usar Collator. Cuidado que um “collator” é um objeto que é muito custoso de ser criado. Neste caso em particular eu o criei fora do método “compare”.
importjava.util.*;importjava.text.*;classExemploCollator{publicstaticvoidmain(String[]args){String[]dados={"José Aparecido","João Simões","Jó Abedenego"};// Não usando "collator"SortedSet<String>s1=newTreeSet<String>();for(Stringd:dados){s1.add(d);}// Deve imprimir [José Aparecido, João Simões, Jó Abedenego], que é // ao contrário das regras da língua portuguesaSystem.out.println(s1);// Usando "collator", segue as regras:// imprime "[Jó Abedenego, João Simões, José Aparecido]"finalCollatorcoll=Collator.getInstance(newLocale("pt","BR"));SortedSet<String>s2=newTreeSet<String>(newComparator<String>(){publicintcompare(Stringo1,Stringo2){returncoll.compare(o1,o2);}});for(Stringd:dados){s2.add(d);}System.out.println(s2);}}