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
-~----------~----~----~----~------~----~------~--~---

Responder a