Remover elementos durante uma iteração só é seguro usando um Iterator.remove(). O mesmo vale para qualquer operacao que modifique a estrutura de dados que está sendo iterada.
Parte da API que fala sobre isso: http://java.sun.com/javase/6/docs/api/java/util/AbstractList.html#modCount Como um foreach é um loop com Iterator disfarçado, mas você não tem acesso a ele, logo remoções vão estragar a consistência da iteração. 2008/9/14 Leonardo Marques <[EMAIL PROTECTED]> > > Já que tocamos no assunto... > Em uma das reuniões, enquanto conversava com o professor sobre > iteradores, ele comentou que no for-each não é possível remover > elementos da coleção, eu disse que era possível sim com algum método > próprio da coleção (O remove() do ArrayList por exemplo), ele disse > que isso pode causar problemas pois removendo um elemento, o iterador > poderia ficar perdido e não saber quem é o próximo elemento da > coleção. > Então, é seguro ou não remover um elemento em um for each? > > On 14 set, 21:03, Peter <[EMAIL PROTECTED]> wrote: > > Espera, espera... > > > > Não só a dúvida original se perdeu como a dica se desvirtuou. > > > > Vamos por partes. > > > > Wander, acredito que sua referência para ArrayList esteja declarado > assim: > > > > (1) ArrayList<Heroi> herois; > > ou > > (2) ArrayList<String> herois; > > > > no caso 1, vc tem um ArrayList onde vc guardará referências para > > instâncias de heróis. > > Ou para simplificar, vc tem "um ArrayList de heróis". > > > > No caso 2 vc apenas guarda o nome dos heróis no ArrayList. > > > > O método LerLinha provavelmente retnora uma String, certo? > > > > Vc só pode guardar strings no array de Strings. > > > > Sugiro que vc crie um herói com o nome lido e adicione o herói que vc > > criou no ArrayList. > > > > Seu problema era este? > > > > Quanto à dica, temos um pequeno histório a percorrer, para uma > > explicação didática. > > Percorrer uma coleção deve ser feito preferencialmente através de um > > iterator e não de métodos posicionais. Isto porque, como veremos mais > > adiante no curso, há outras coleções que podem ser facilmente > > substituídas se tomarmos cuidado com os métodos que utilizarmos. Há > > coleções com características específicas de desempenho em determinadas > > situações e o ideal é que possamos trocá-las sem dificuldade. Portanto, > > para ter uma maneira uniforme de percorrê-las, devemos usar Iterator, > > pois sua utilização é igual para todas as coleções: > > > > Iterator<String> it = a.iterator(); > > while(it.hasNext()) { > > System.out.print(it.next() + " "); > > > > } > > > > Durante muito tempo esta foi a forma de se percorrer coleções. No > > entanto, ela tem problemas. Ao terminar o while, o iterator fica alocado > > e utilizá-lo (it.next()) gerará erros. Isto era uma possível (e > > constante) fonte de problemas. > > Outra questão é que ficamos com uma referência guardada para o iterator > > que já poderia ser coletado. > > > > Assim, esta forma evoloui para: > > > > for (Iterator<String> it = a.iterator(); it.hasNext();) { > > System.out.print(it.next() + " "); > > > > } > > > > Ficando agora a referência para o iterator válida apenas no escopo do > for. > > > > A partir do Java 5, esta forma foi "incorporada" com o que se conhecia > > como "for each" e em java, "enhanced for": > > > > for (String nome : colecao) { > > System.out.print(nome + " "); > > > > } > > > > Onde lemos "para cada nome na coleção...". > > > > E é assim a forma mais indicada para se percorrer uma coleção ou um > > vetor (vetores, daqueles com colchetes [] também pode ser percorridos > > assim...) não só é mais prático como mais elegante e traz a vantagem de > > que não precisaremos modificar o código se mudarmos a coleção que > > armazena os itens percorridos. > > > > Desculpem pelo e-mail longo. Ou foi necessário ou foi um erro meu de > > julgamento. *rs* > > > > Wander, como tá a dúvida cara? Já leu os métodos na API? Viu o que eles > > fazem? > > > > Abraço! > > > > Peter P. Lupo > > Undergraduating in Computer Science DCC/UFRJ > > Sun Certified Java Associatehttp://pplupo.googlepages.com/ > > Cell. +55 (21) 81742487 > > > > Vitor Maia wrote: > > > Verdade, como o ArrayList tem índices, pode ser usado o "for" normal. > > > Iterator e for-each só são necessários em coleções em que não há uma > > > sequência numerada de elementos, como o TreeSet. > > > > > 2008/9/14 Leonardo Marques <[EMAIL PROTECTED] > > > <mailto:[EMAIL PROTECTED]>> > > > > > Mais um detalhe, não é necessário iterador p/ percorrer ArrayList, > > > pode usar o for normal mesmo. > > > > > On 14 set, 11:11, "Vitor Maia" <[EMAIL PROTECTED] > > > <mailto:[EMAIL PROTECTED]>> wrote: > > > > Tenta fazer > > > herois.get(0).setNomeVerdadeiro(objectLeitura.lerLinha()); > > > > Pra acessar elementos do ArrayList você tem que usar o get. > > > > > > 2008/9/14 Wander <[EMAIL PROTECTED] <mailto: > [EMAIL PROTECTED]>> > > > > > > > Pô, me ajudou pra caramba, mas o meu caso é um pouco mais > > > complicado > > > > > pois a ArrayList tem um tipo que é uma classe, nesse caso a > classe > > > > > SuperHeroi.Ou seja, não estou conseguindo acessar certos > > > métodos. Por > > > > > exemplo: > > > > > > > Seja herois o nome da ArrayList. tentei fazer o seguinte: > > > > > > > herois(0).setNomeVerdadeiro(objectLeitura.lerLinha()); //onde > > > > > objectLeitura é uma instância da classe Console > > > > > > > Mas não deu certo, eu pensei que poderia fazer esse tipo de > > > coisa já > > > > > que herois(0) é uma instância de SuperHeroi, ou estou enganado? > > > > > > > > Wander, fiz um exemplo que adiciona, remove, exibe e itera. > > > > > > > > import java.util.ArrayList; > > > > > > import java.util.Iterator; > > > > > > > > public class Exemplo { > > > > > > > > public static void main(String[] args) { > > > > > > > > // Criando um ArrayList vazio para números inteiros > > > > > > ArrayList<String> a = new ArrayList<String>(); > > > > > > > > a.add("a"); // Elemento adicionado na posição 0 > > > > > > a.add("b"); // Elemento adicionado na posição 1 > > > > > > a.add("c"); // Elemento adicionado na posição 2 > > > > > > > > // Será impresso na tela o elemento na posição 0 > > > > > > System.out.println(a.get(0)); > > > > > > > > // Agora o elemento "d" é adicionado na posição 0, > > > > > > // empurrando todos os elementos já existentes para a > > > frente. > > > > > > a.add(0,"d"); > > > > > > > > // Será impresso na tela o elemento na posição 0 > > > > > > // outra vez. Desta vez é o "d". > > > > > > System.out.println(a.get(0)); > > > > > > > > // Modos de iterar: Iterator e For-Each > > > > > > Iterator<String> it = a.iterator(); > > > > > > while(it.hasNext()) { > > > > > > System.out.print(it.next() + " "); > > > > > > } > > > > > > System.out.println(); > > > > > > //ou > > > > > > for(String i : a) { > > > > > > System.out.print(i + " "); > > > > > > } > > > > > > System.out.println(); > > > > > > // Remove o elemento da posição 0 > > > > > > a.remove(0); > > > > > > // Remove o primeiro "b" que for encontrado. > > > > > > a.remove("b"); > > > > > > > > // Para conferir as remoções: > > > > > > it = a.iterator(); > > > > > > while(it.hasNext()) { > > > > > > System.out.print(it.next() + " "); > > > > > > } > > > > > > } > > > > > > > > } > > > > > > > > 2008/9/14 Cleiton Menezes <[EMAIL PROTECTED] > > > <mailto:[EMAIL PROTECTED]>> > > > > > > > > > Caro Wander, se você puder ser umpouco mais específico com > > > sua dúvida, > > > > > eu > > > > > > > posso te ajudar, por exemplo, que tipo de manipulação vc > > > não está > > > > > > > conseguindo fazer? inserir, iterar, remover elementos, é > isso? > > > > > > > > > 2008/9/14 Wander <[EMAIL PROTECTED] > > > <mailto:[EMAIL PROTECTED]>> > > > > > > > > >> Como faltei a maioria das aulas de ArrayList estou tendo > > > dificuldade > > > > > > >> na manipulação de ArrayList, se puderem me ajudar > > > postando um exemplo > > > > > > >> simples que faça o adicionar e o exibir, agradeço. Gostei > > > muito do > > > > > > >> exemplo que o professore deu dos Animais, mas já não me > > > lembro mais. > > > > > > > > -- > > > > > > Vitor Carneiro > > > Maiawww.dcc.ufrj.br/~vitormaia-<http://Maiawww.dcc.ufrj.br/%7Evitormaia-> > > > <http://Maiawww.dcc.ufrj.br/%7Evitormaia->< > http://Maiawww.dcc.ufrj.br/%7Evitormaia->Ocultar > > > texto entre aspas - > > > > > > > > - Mostrar texto entre aspas - > > > > > > -- > > > > Vitor Carneiro > > > Maiawww.dcc.ufrj.br/~vitormaia<http://Maiawww.dcc.ufrj.br/%7Evitormaia> > > > <http://Maiawww.dcc.ufrj.br/%7Evitormaia> > > > > > -- > > > Vitor Carneiro Maia > > >www.dcc.ufrj.br/~vitormaia <http://www.dcc.ufrj.br/%7Evitormaia>< > http://www.dcc.ufrj.br/%7Evitormaia> > > > -- Flávio Coutinho da Costa --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Comp 2 - Geral" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/comp2-geral?hl=en -~----------~----~----~----~------~----~------~--~---
