Problema com valores repetidos em um ArrayList

Bom Dia, gostaria de pedir a ajuda de vocês para resolver uma problema de um ArrayList. Eu tenho vários nomes em uma list e alguns desses são repetidos, e eu precisaria apagar esses repetidos. Já tentei esse código mas nao deu certo

for(int i = 0; i < lista.size(); i++ { for(int j = 1; j < lista.size(); j++) { if(lista.get(i).equals(lista.get(j) ){ lista.remove(j); } } }

Alguém tem alguma outra idéia ??

Grato, Evandro

Blz.

Use o for each e intere direto o list

tipo assim:

for(String nome : list){

}

peque as duas String e compare com o equals().
De vez de vc tirar do list, monte um list novo com os nomes sem repetição

Até hoje eu não entendi direito esse for each
você pode fazer um exemplo pra mim?

grato

No for aprimorado, você faz o código abaixo

for(int numero : array){ //faz alguma coisa }

ao invés de:

for(int i = 0; i < array.length; i++){ //faz alguma coisa }

Só que no for aprimorado, você não usa o array em si, mas para cada iteração, voce passa o valor que está no array para a variável "numero". Aí você usa o valor que está em "numero" para realizar alguma coisa que deseja. Nesse tipo de for você não modifica o array, mas somente usa seus valores.

Ou seja, suponha que voce tenha array[0] = 2, array[1] = 3, array[2] = 4. Você passará na primeira iteração do for o valor 2 para “numero”, na segunda iteração passará o valor 3 para “numero” (lembrando que “numero” não é um array, portanto ele passará a ter somente o valor 3) e assim por diante.

blz, fácil de entender, tem q ter pelo menos o java 5 ou superior

Se vc monta um List de objetos, por exemplo um list de Usuario

Classe Usuário

public class Usuario{

private long id;
private String nome;

// implementar gets e sets
}

Então dentro de um list vc joga vários Usuarios e vc quer recuperar esses Usuarios depois, vc usa o for each q é bem mais simples


for(Usuario usuario : list){
     System.out.println(usuario.getNome());
     System.out.println(usuario.getId());
}

ou pode ser assim, caso vc trabalhe com Objects


for(Objects obj : list){
     Usuario usuario = (Usuario) obj;
     System.out.println(usuario.getNome());
     System.out.println(usuario.getId());
}

blz??

Quanto ao seu problema em si, eu também achei que fosse dar certo pelo seu algoritmo…tentei fazer um teste aqui mas também não deu resultado. Usei uma lista de Strings… nas iterações (usando o for normal) ele apagou algumas Strings que não eram repetidas e manteve algumas repetidas…

Entendi o problema… ta acontecendo isso:

list.add(“Bacana”);
list.add(“Chato”);
list.add(“Bacana”);
list.add(“ShowDeBola”);
list.add(“Bacana”);

Bom, após a primeira iteração voce teria na lista: Bacana, Chato, ShowDeBola.

Porém, na segunda iteração o seu valor i = 1 e j = 1. Portanto, neste exemplo voce compara Chato com Chato, e o apaga. Por isso acaba apagando alguns valores que não são repetidos.

Vlw ae, entendi como funciona o for-each mas ainda nao sei como vou fazer para apagar os valores repetidos…

Grato

for each melhorado não serve para os casos onde você precisa do iterator, como justamente remover itens de uma lista da maneira mais rápida.

Outra opção muito mais fácil é saber que a interface Set da Collections não permite itens duplicados. Então:

lista = new ArrayList(new HashSet(lista));

Edit: Ok, deve funcionar.

isso mesmo que está acontecendo ! = )

Entao se eu criasse um Set os repetidos seriam eliminados[url]?

sets não permitem duplicatas

uma alternativa facil para remover os repetidos é vc criar algum set como um hashset por exemplo e ir inserindo do list no set… se ja tiver inserido algum item ele não será inserido novamente no hashset… ai depois se vc não quiser trabalhar com o hashset vc pode iterar sobre ele jogando num arraylist denovo…

claro que a melhor alternativa é vc trabalhar com o hashset dezde o começo e assim nem ter as duplicatas para remover, mais se vc recebe os dados no formato arraylist essa é uma opção para resolver o seu problema… o que não impede de vc criar um algoritmo em cima do arraylist, comparando no if e caso seja igual a algum outro (eu indicaria comparar com os itens anteriores da lista), vc remove-lo… o que é menos legivel…

vou tentar com o HashSet, se nao der certo posto novamente.
Grato a todos !
= )

Fiz um exemplo de como fazer isso utilizando ArrayList com Set

package teste;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;

public class Teste {
	
	public static void main(String[] args) {
		
		Collection lista = new ArrayList();
		lista.add("1");
		lista.add("2");
		lista.add("4");
		lista.add("5");
		lista.add("1");
		lista.add("1");
		
		lista = Collections.singleton(new HashSet(lista));
		
		for (Object object : lista) {
			System.out.println(object.toString());
		}
	}
}

Consegui, usei o set como vocês disseram e depois adicionei ao ArrayList.

Grato a todos que ajudaram.

:smiley:

outra maneira de remover duplicados de listas…

private void removerDuplicados() {
	for (int i = 0; i < combinacoes.size(); i++) {
		Object a = combinacoes.get(i);
		
		for (int j = i+1; j < combinacoes.size(); j++) {
			Object b = combinacoes.get(j);
			if (a.equals(b)) {
				combinacoes.remove(j);
				j--;
			}
		}
	}
}
1 curtida

Sei que o tópico já está “morto” mas minha dica pode ajudar algum googleiro.
Caso listNomes for uma lista de vetores de Strings por exemplo, para resolver o problema também poderia ser usado o trecho de código abaixo:

ArrayList<String[]> listNomes2 = new ArrayList<String[]>();

for(String[] c0: listNomes){ 
            boolean found = false;
            for(String[] c: listNomes){
                if(Arrays.equals(c, c0)) 
                    found = true;
            }
            if(!found)
                listNomes2.add(c0); 
        }

Nesse caso ao final dos dois laços, “listNomes2” terá uma cópia completa e sem duplicidade de “listNomes”.

1 curtida