Bom dia,
alguém pode me dar uma dica. Estou usando um objeto List pra armazenar uma lista de objetos de banco de dados, mas surgiu a necessidade de impedir a repetição de elementos. Tem alguma técnica pra eu fazer isso, algum objeto compativel com list que facilite a lista sem repetição?
Lembrando que, ao usar Set, voce precisa implementar os metodos equals() e hashCode()
Rafael
P
Paulo_Silveira
dependendo do Set nao vai precisar de hashCode, mas ja eh uma boa.
crisadias, use java.util.HashSet, interfaceado pela Set como ja falaram.
M
marcioa1
Olá,
O set é mais indicado, mas existe ainda o List.contains(Object o), que diz se um objeto já está na lista. Acho que para isto é preciso reescrever equals e hashCode().
Márcio
C
crisadias
Pessoal,
posso então continuar usando o List e fazer a comparação com .contains desde que reescreva o método equals() do meu objeto, certo? É a melhor solução no caso.
Valeu pela ajuda.
R
rafael.pereira
Lembre-se que para reescrever equals() e hashCode() você tem que garantir algumas coisas para que sua classe fique consistente.
Objetos considerados iguais pelo método equals() precisam necessariamente possuir o mesmo hashCode().
Objetos diferente não necessariamente precisam ter hashCode() diferentes.
L
louds
Paulo Silveira:
dependendo do Set nao vai precisar de hashCode, mas ja eh uma boa.
crisadias, use java.util.HashSet, interfaceado pela Set como ja falaram.
Dependendo do Set? Hmm, ou ele é feito com hashing e precisa do hashCode, ou é feito usando arvores, ai precisa do Comparable, um contrato beeeem mais dificil de implementar.
T
thingol
Alguém precisa disponibilizar aqui um Comparator “genérico”. Alguma coisa que fosse usada assim:
Digamos que você tivesse um TreeSet de ClienteVO, onde ClienteVO tem os seguintes atributos: double salario, String nome, String sobrenome.
SortedSetminhaListaOrdenada=newTreeSet(newComparatorGenerico(newString[]{"sobrenome","nome"}));minhaListaOrdenada.add(newClienteVO("José","Aparecido",100.0));minhaListaOrdenada.add(newClienteVO("James","Gosling",200.0));SortedSetminhaListaOrdenada2=newTreeSet(newComparatorGenerico(newString[]{"-salario","+sobrenome"}));// "-salario" porque queremos algo parecido com "ORDER BY SALARIO DESC, BY SOBRENOME ASC"minhaListaOrdenada2.add(newClienteVO("Jonathan","Schwartz",1000.0));minhaListaOrdenada2.add(newClienteVO("James","Gosling",200.0));
Não é difícil de escrever (nada que um pouco de reflection não resolva) mas dá trabalho…
ops escrevi no topico errado… mod poderia apagar isso aki?
T
tads
Bom dia,
Estou tentando implementar um Comparator genérico ond eu passo
um vetor de strings ou talvez uma lista de strings que são os atributos pelos quais eu vou ordenar.
Já tenho um comparator que é usado apenas para um atributo:
publicclassObjectComparatorimplementsComparator{/** propertyToCompare to attribute */privateStringpropertyToCompare;/** * Creates a new ObjectComparator object. * * @param propertyToCompare property of object to compare */publicObjectComparator(StringpropertyToCompare){this.propertyToCompare=propertyToCompare;}/** * Compares the first object with second object using the property defined * in the constructor * * @param o1 first object * @param o2 second object * * @return int */publicintcompare(Objecto1,Objecto2){intreturnValue=0;if((o1==null)||(o2==null)){if((o1==null)&&(o2==null)){returnValue=0;}elseif(o1==null){returnValue=-1;}elseif(o2==null){returnValue=1;}returnreturnValue;}ObjectobjValue1=ObjectReflection.getFieldValue(o1,propertyToCompare);ObjectobjValue2=ObjectReflection.getFieldValue(o2,propertyToCompare);if((objValue1==null)&&(objValue2==null)){returnValue=0;}elseif(objValue1==null){returnValue=-1;}elseif(objValue2==null){returnValue=1;}else{Comparablevalue1=null;Comparablevalue2=null;if(objValue1instanceofCalendar){value1=(Comparable)((Calendar)objValue1).getTime();}else{value1=(Comparable)objValue1;}if(objValue2instanceofCalendar){value2=(Comparable)((Calendar)objValue2).getTime();}else{value2=(Comparable)objValue2;}returnValue=value1.compareTo(value2);}returnreturnValue;}
Porém, como fazer daki em diante?
Se alguém puder dar uma dica…
valew
T
tads
Blz?
encontrei uma solução muito legal sobre fazer este tipo de ordenação,
usando o ComparatorChain do org.apache.commons.collections.comparators.