Comparação de duplicidade numa list

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 vc utilizar o metodo addAll das classes que implementam a interface Set, e ele retornar false, é prq existem elementos duplicados na lista. So tome cuidado prq cada implementação do Set compara os objetos de forma diferente.
Ex HashSet utiliza o metodo hashcode para determinar duplicidade.

sugiro um for dentro de outro for… exemplo:

 for (int a = 0; a < lista.size(); a++){ 

 ObjetoX x = lista.get(a); 
 for (int b = 0; a < lista.size(); b++){ 

 ObjetoX y = lista.get(b); 
if(x.getAtributo().equal( y.getAtributo() )){
faz alguma coisa
}
}
}
1 curtida

hâm ?
e o equals fica onde na historia?

Bom… respondendo à duvida do colega…

sobrescreva o método equals() e hashCode() na sua classe ( por exemplo vc pode dizer que 2 Clientes são iguais se seus ID’s forem iguais )…

Depois, use um LinkedHashSet ao invés de ArrayList para adicionar seus objetos… ele nao permite objetos “duplicados”.

[quote=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?[/quote]

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.

  1. Crie uma forma de determinar se dois objetos da lista são iguais. Faça isso implementando um Comparator.
  2. 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]

[quote]hâm ?
e o equals fica onde na historia? [/quote]

hoho vc tem razão não sei da onde eu tirei isto, eu tinha tanta certeza que ele usava hashcode que eu até escrevi um codigo para provar minha tese, que deu errado logico haha

[quote=Abdon][quote]hâm ?
e o equals fica onde na historia? [/quote]

hoho vc tem razão não sei da onde eu tirei isto, eu tinha tanta certeza que ele usava hashcode que eu até escrevi um codigo para provar minha tese, que deu errado logico haha[/quote]

usa hashcode sim… porém hashCode e equals trabalham JUNTOS…

aquela velha história dos baldes, e os papeizinhos com nomes de pessoas dentro do balde… com o hashcode vc chega no balde… tendo o balde, com o equals vc acha o papelzinho dentro do balde…

Eu não lembro aonde vi mais o metodo contain() das classes Hashtable, HashMap, HashSet utilizam o hashcode para verificar
e as interfaces de List o equals

posso ter me enganado

Então eu tb pensava, so que fiz um testes aqui que provam que nosso amigo fabiocsi esta certo.
Observe:

class lixo {
	
	public int hashCode() {
		return 33;
	}
	
	public boolean equals(Object obj) {
		return false;
	}
}

public class teste {

	public static void main(String args[]) {
		Set mapa = new HashSet();
		System.out.println(mapa.add(new lixo()));
		System.out.println(mapa.add(new lixo()));
		System.out.println(mapa.contains(new lixo()));
	}
}

Todos os hashCode vão ser 33 logo o segunda sysout deveria retornar false (duplicado, já existe) e o ultimo deveria retornar true (já contem um objeto com o mesmo hashCode) so que o resultado encontrado foi exatamente o contrario ajustando o equal, da para ver que é ele quem manda na parada.

vlw pessoal a ajuda, mas ainda não consegui resolver meu problema.
o que preciso saber nao eh somente se existe a duplicidade, mas tb quais são, até tentei seguir o q sergiotaborda colocou, nao sei se era isso q ele sugeriu:

private Comparator comparator() {
	return new Comparator() {
		public int compare(Object o1, Object o2) {
			ProgCheque p1 = (ProgCheque) o1;
			ProgCheque p2 = (ProgCheque) o2;
			int retorno = p1.getNuConta().compareTo(p2.getNuConta());
			if (retorno != 0)
				return retorno;
			
			return retorno;
		};
	};
}

utilizei o proprio metodo q ele colocou, mas nao sei o fiz de errado.

protected Collection repetidos( Collection col, Comparator comp ){
    // elimina duplicados
    Set set = new TreeSet( comp );
    set.addAll( col );
    List all = new LinkedList( col ); // clone
    all.removeAll( set );  
   // deixa apenas os que estão em col e não em t, ou seja, os duplicados
   return all;

}