Também não dá para resolver com foreach as iterações onde você precisa eliminar elementos da lista que você está iterando.
Um exemplo é esse:
String nomeParaRemover = "Vinicius";
List<String> umaLista = new ArrayList<String>(
Arrays.asList("João", "Maria", "Vinícius", "José"));
for (String nome : umaLista) {
if (nome.equals(nomeParaRemover)) {
umaLista.remove(nome); //Vai gerar ConcurrentModificationException
}
}
O correto é remover através do iterator, como mostrado abaixo:
[code]
String nomeParaRemover = “Vinicius”;
List umaLista = new ArrayList(
Arrays.asList(“João”, “Maria”, “Vinícius”, “José”));
Iterator it = umaLista.iterator();
while (it.hasNext()) {
String nome = it.next();
if (nome.equals(nomeParaRemover)) {
it.remove();
}
}[/code]
Uma alternativa um pouco menos eficiente, mas bastante prática e que gera um código bastante limpo é fazer uma cópia da lista e iterar sobre a cópia.
[code]
String nomeParaRemover = “Vinicius”;
List umaLista = new ArrayList(
Arrays.asList(“João”, “Maria”, “Vinícius”, “José”));
List copia = new ArrayList(umaLista);
for (String nome : copia) { //Percorremos a cópia
if (nome.equals(nomeParaRemover)) {
umaLista.remove(nome); //Mas removemos da lista original
}
}[/code]
Outra alternativa, é percorrer a lista ao contrário. Mas isso só serve para o ArrayList:
[code]
String nomeParaRemover = “Vinicius”;
List umaLista = new ArrayList(
Arrays.asList(“João”, “Maria”, “Vinícius”, “José”));
for (int i = umaLista.size()-1; i >= 0; i–) { //Percorremos ao contrário
if (umaLista.get(i).equals(nomeParaRemover)) {
umaLista.remove(i); //Pois esse comando altera os índices de quem vem depois.
}
}[/code]
Embora gerem um código limpo, nenhuma dessas técnicas é mais eficiente ou mais genérica do que usar o próprio iterator, quando o assunto é remoção.