Em um ArrayList você não pode remover um objeto da lista enquanto a está percorrendo.
Uma implementação de List chamada CopyOnWriteArrayList permite fazer isso:
http://java.sun.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html
Em um ArrayList você não pode remover um objeto da lista enquanto a está percorrendo.
Uma implementação de List chamada CopyOnWriteArrayList permite fazer isso:
http://java.sun.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html
Usa iterator:
public class Teste extends JFrame {
public Teste() {
List<Integer> lista = new ArrayList<Integer>();
lista.add(1);
lista.add(2);
lista.add(3);
Iterator<Integer> it = lista.iterator();
while(it.hasNext()){
if(it.next() == 1) it.remove();
}
}
public static void main(String args[]) {
new Teste();
}
}
Aham, iterator também não funciona. O problema é mesmo da classe.
Veja o exemplo abaixo.
package exemplos;
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class Listas {
private static void popular (List<Integer> list) {
// Populando a lista...
for (int i = 1; i <= 10; ++i) {
list.add (i);
}
}
public static void teste1 (List<Integer> list) {
popular (list);
// Tentando remover um elemento dessa lista, usando o foreach
try {
for (Integer i : list) {
if (i == 3)
list.remove(i);
}
System.out.println ("Consegue remover um elemento de um " + list.getClass() + " com foreach");
} catch (ConcurrentModificationException ex) {
System.out.println ("Não consegue remover um elemento de um " + list.getClass() + " com foreach");
}
}
public static void teste2 (List<Integer> list) {
popular (list);
// Tentando remover um elemento dessa lista, usando o iterator
try {
for (Iterator<Integer> it = list.iterator(); it.hasNext(); ) {
Integer i = it.next();
if (i == 3)
list.remove(i);
}
System.out.println ("Consegue remover um elemento de um " + list.getClass() + " com Iterator");
} catch (ConcurrentModificationException ex) {
System.out.println ("Não consegue remover um elemento de um " + list.getClass() + " com Iterator");
}
}
public static void main(String[] args) {
teste1 (new ArrayList<Integer>());
teste1 (new LinkedList<Integer>());
teste1 (new CopyOnWriteArrayList<Integer>());
teste2 (new ArrayList<Integer>());
teste2 (new LinkedList<Integer>());
teste2 (new CopyOnWriteArrayList<Integer>());
}
}
Ele imprime:
Não consegue remover um elemento de um class java.util.ArrayList com foreach
Não consegue remover um elemento de um class java.util.LinkedList com foreach
Consegue remover um elemento de um class java.util.concurrent.CopyOnWriteArrayList com foreach
Não consegue remover um elemento de um class java.util.ArrayList com Iterator
Não consegue remover um elemento de um class java.util.LinkedList com Iterator
Consegue remover um elemento de um class java.util.concurrent.CopyOnWriteArrayList com Iterator
[quote=thingol]Aham, iterator também não funciona. O problema é mesmo da classe.
Veja o exemplo abaixo.
[/quote]
Não tenho certeza mas acho que com Iterator funciona sim, da forma que o Ivo costa postou, removendo o elemento do Iterator e não da lista
it.remove();
Só pra dar certeza:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class Listas {
private static void popular (List<Integer> list) {
for (int i = 1; i <= 10; ++i) {
list.add (i);
}
}
public static void teste2 (List<Integer> list) {
popular (list);
for (Iterator<Integer> it = list.iterator(); it.hasNext(); ) {
Integer i = it.next();
if (i == 3)
{
it.remove();
}
}
System.out.println(list.size());
}
public static void main(String[] args) {
teste2 (new ArrayList<Integer>());
teste2 (new LinkedList<Integer>());
}
}
Vivendo e aprendendo.
package exemplos;
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class Listas {
private static void popular (List<Integer> list) {
// Populando a lista...
for (int i = 1; i <= 10; ++i) {
list.add (i);
}
}
public static void teste1 (List<Integer> list) {
popular (list);
// Tentando remover um elemento dessa lista, usando o foreach
try {
for (Integer i : list) {
if (i == 3)
list.remove(i);
}
System.out.println ("Consegue remover um elemento de um " + list.getClass() + " com foreach");
} catch (ConcurrentModificationException ex) {
System.out.println ("Não consegue remover um elemento de um " + list.getClass() + " com foreach");
}
}
public static void teste2 (List<Integer> list) {
popular (list);
// Tentando remover um elemento dessa lista, usando o iterator
try {
for (Iterator<Integer> it = list.iterator(); it.hasNext(); ) {
Integer i = it.next();
if (i == 3)
list.remove(i);
}
System.out.println ("Consegue remover um elemento de um " + list.getClass() + " com Iterator");
} catch (ConcurrentModificationException ex) {
System.out.println ("Não consegue remover um elemento de um " + list.getClass() + " com Iterator");
}
}
public static void teste3 (List<Integer> list) {
popular (list);
// Tentando remover um elemento dessa lista, usando o iterator
// e removendo usando Iterator.remove, não List.remove
try {
for (Iterator<Integer> it = list.iterator(); it.hasNext(); ) {
Integer i = it.next();
if (i == 3)
it.remove();
}
System.out.println ("Consegue remover um elemento de um " + list.getClass() + " com Iterator.remove");
} catch (ConcurrentModificationException ex) {
System.out.println ("Não consegue remover um elemento de um " + list.getClass() + " com Iterator.remove");
} catch (UnsupportedOperationException ex) {
System.out.println ("Não consegue remover um elemento de um " + list.getClass() + " com Iterator.remove");
}
}
public static void main(String[] args) {
System.out.println ("---------");
teste1 (new ArrayList<Integer>());
teste1 (new LinkedList<Integer>());
teste1 (new CopyOnWriteArrayList<Integer>());
System.out.println ("---------");
teste2 (new ArrayList<Integer>());
teste2 (new LinkedList<Integer>());
teste2 (new CopyOnWriteArrayList<Integer>());
System.out.println ("---------");
teste3 (new ArrayList<Integer>());
teste3 (new LinkedList<Integer>());
teste3 (new CopyOnWriteArrayList<Integer>());
System.out.println ("---------");
}
}
Ele imprime:
---------
Não consegue remover um elemento de um class java.util.ArrayList com foreach
Não consegue remover um elemento de um class java.util.LinkedList com foreach
Consegue remover um elemento de um class java.util.concurrent.CopyOnWriteArrayList com foreach
---------
Não consegue remover um elemento de um class java.util.ArrayList com Iterator
Não consegue remover um elemento de um class java.util.LinkedList com Iterator
Consegue remover um elemento de um class java.util.concurrent.CopyOnWriteArrayList com Iterator
---------
Consegue remover um elemento de um class java.util.ArrayList com Iterator.remove
Consegue remover um elemento de um class java.util.LinkedList com Iterator.remove
Não consegue remover um elemento de um class java.util.concurrent.CopyOnWriteArrayList com Iterator.remove
---------
É que para mim é estranho que Iterator tenha uma operação “remove”. Não entra na minha cabeça
Herança do C++, certo?
Que tal isso?
if (suaLista.contains(seuObjeto)) {
suaLista.remove(seuObjeto);
}
Essa abordagem é simples de implementar, porém, tem a pior performance de todas. Cuidado ao usa-la em listas grandes.
Afinal, tanto o contains irá localizar o elemento, mas a informação da posição não será usada na hora de chamar o remove, o que faz com que o método de remoção procure o elemento novamente.
Uma alternativa otimizada seria:
int index = suaLista.indexOf(elemento);
if (index != -1)
suaLista.remove(index);
De qualquer forma, lá em 2008, o autor original do tópico gostaria de remover um elemento enquanto percorria uma coleção. Alternativa que no java hoje, existem duas soluções:
Ah sim, antes que eu me esqueça. Outra alternativa otimizada para seu código é simplesmente:
boolean removeu = lista.remove(objeto);
Afinal, o remove não tem qualquer problema em ser chamado sem o objeto na lista, o que elimina a necessidade de testar o contains. Além disso, o método retorna true se algo foi removido, o que permite a você dar um aviso, caso o elemento não estivesse na lista original.
E eu achando que estava botando p/ quebrar com as minhas duas linhas de código e vem o Vini e com uma linha resolve o problema com maior performance!
Por isso amo essa trabalho, todos os dias aprendo alguma coisa.
Valeu Vini!!
Acabei de passar por esse problema com o remove do List. O remove do Iterator resolveu. Obrigado pelo compartilhamento!
putz sempre removi assim, vc apenas tem q zerar o for para ajustar o tamanho da lista
[code] List<Integer> lista = new ArrayList<Integer>();
lista.add(1);
lista.add(2);
lista.add(3);
System.out.println("Tamanho da lista antes: "+lista.size());
for(int count=0;count<lista.size();count++){
int numero = lista.get(count).intValue();
if(numero >0){
lista.remove(count);
count=-1;
}
}
System.out.println("Tamanho da lista depois: "+lista.size()); [/code]
RESULTADO ----------------------
Tamanho da lista antes: 3
Tamanho da lista depois: 0
[quote=ViniGodoy]1. Usar o iterator;
2. Copiar os elementos para uma nova lista, “pulando” os elementos que teriam de ser removidos. [/quote]
Isso.
Lista<Defeito> lista = new ArrayList<Defeito>();
Defeito d = new Defeito(1);
Defeito d1 = new Defeito(2);
Defeito d2 = new Defeito(3);
lista.add(d);
lista.add(d1);
lista.add(d2);
for (Defeito d : lista) {
if (d.getCodigo == 1) {
lista.remove(d);
}
}
Gente eu estou percorrendo a colecao fazendo com que seja removido esse objeto da lista…Sendo que o objeto ja foi inserido normalmente na colecao !!! Quanto a isso ta tudo ok…
O problema é quando tento remover ele da lista … Quando ele remover e volta pra percorrer a lista novamento aparece esse erro(Exception) !!!
(AbstractList.java:372)
java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
Funciona sim…aki funfou legal !!!