Iteração de uma lista

4 respostas
M

Oi,

estou com um problema. Tenho um conjunto de objectos numa lista. Estou a iterá-la. Durante o processo do iterador eu tenho que adicionar mais elementos à lista. Dá-me uma mensagem excepção “java.util.ConcurrentModificationException”.

Qual é a solução para este problema i.e., como é que posso percorrer uma lista, adicionando ou removendo se quiser novos elementos à lista sem dar erro?

Obrigado

MP

4 Respostas

devel.andrerocha

Não seria o caso de criar uma lista auxiliar?

Jair_Rillo_Junior

Você não pode percorrer uma lista (através do Iterator) e tentar modifica-la. Nesse caso, a melhor solução como o colega já citou, é usar uma lista Auxiliar

lelodois

posta seu código ai!!!

ViniGodoy

Há duas soluções para o seu problema:

  1. Usar o ListIterator (para remover, pode ser só o iterator padrão).
ListIterator<SuaClasse> it = lista.listIterator();
while (it.hasNext()) {
    SuaClasse obj = it.next();
    if (devoRemover(obj)) {
       it.remove(); //Ok, esse remove apaga o objeto sem ConcurrentModificationException
    }
}
  1. Tirar uma cópia da lista. É fácil, basta fazer:
List<SuaClasse> umaNovaLista = new ArrayList<SuaClasse>(listaOriginal);

Aí vc percorre a cópia e trabalha na lista original.

Geralmente, a primeira opção é a mais fácil para remoção. A segunda opção quebra um galho em diversos casos, principalmente quando a operação na lista será feita através de outro método, cujo comportamento é complexo e poderá mudar no futuro.

Criado 30 de setembro de 2008
Ultima resposta 30 de set. de 2008
Respostas 4
Participantes 5