avsouza:
Boa tarde, tenho uma classe que contém uma lista de outro objeto. tenho q percorrer a lista e verificar se existe alguma duplicidade nela.
Como posso fazer isso de forma mais simples?
Tinha pensado em fazer assim:
for (int a = 0; a < lista.size(); a++){
ObjetoX x = lista.get(a);
ObjetoX x1 = lista.get(a+1);
if(x.getAtributo().equal( x.getAtributo() )){
faz alguma coisa
}
nao creio q este jeito seja o mais inteligente.
Alguma sugestão?
Se o seu objetivo é não permitir duplicados, use um Set , como já foi dito aqui. Se o seu objetivo é simplesmente verificar se existem duplicados a conversa é outra, mas semelhante.
- Crie uma forma de determinar se dois objetos da lista são iguais. Faça isso implementando um Comparator.
- Use o comparador para inserir objetos num TreeSet. Este tipo especial de Set usa um comparador para saber se os objetos são iguais ou não.
Assim, supondo que vc já tem um comparador (comp) o seu codigo seria
public boolean temRepetidos(Collection col, Comparator comp){
// elimina duplicados
Set t = new TreeSet(comp);
t.addAll(col);
// se os tamnhos são diferentes é pq algum item de col era repetido
return t.size()!=col.size();
}
Esta é a forma mais elegante, quanto a mim, de fazer.
Existem outra formas, como contar quantas copias existem do objeto na lista.
Se o seu objetivo é não apenas saber se ha repetidos mas tb saber quais são
public Collection repetidos(Collection col, Comparator comp){
// elimina duplicados
Set t = new TreeSet(comp);
t.addAll(col);
List all = new LinkedList (col); // clone
all.removeAll(t);
// deixa apenas os que estão em col e não em t
// ou seja, os duplicados
return all;
}
[size=9]Nota: Os objetos da lista têm que implementar equals e hashcode de forma compativel com o comparator[/size]