Dúvida sobre Iterators

7 respostas
felipegmc

Olá!

Tenho uma dúvida sobre a utilização de Iterators: criei um ArrayList, e um iterator deste ArrayList.
Para pegar os itens da lista, devo usar o método next do iterator, certo? Após usar o next, o iterator fica na primeira posição da lista, e usando novamente o next, consigo pegar o próximo item da lista.
Mas como eu faria para pegar o item que está na posição atual do iterator? Por exemplo, dei um next, e agora estou no segundo item da lista e preciso acessá-lo novamente, sem ir para o próximo.

7 Respostas

ViniGodoy

Guarde esse item numa variável. E não use o next novamente.
Por exemplo:

public void excluiItensPorTipo(List<Item> itens) {
   Iterator<Item> it = itens.iterator();
   while (it.hasNext) {
      Item item = it.next();
      if (item.getTipo() == tipoAExcluir) {
           it.remove();
           System.out.println("Excluído: " + item.getDescricao());
      }
   }
}

Note que a variável item foi usada 3 vezes.

victor.godinho

Não dá ^^.

Por isso você tem que guardar o Objeto retornado (no .next() ).

victor.godinho

ops… tava digitando na hora… rs, bem… é isso ai. :stuck_out_tongue: haha

ViniGodoy

Só lembrando que no caso de uma iteração simples (sem exclusão) é melhor usar o for each:

for (Item item : listaDeItens) {
    System.out.print("Descrição: " + item.getDescricao());
    System.out.println(" Preço: " + item.getPreco());
}

Esse é de longe o caso mais comum. E fica mais limpo do que:

Iterator it = listaDeItens.iterator(); while (it.hasNext()) { Item item = it.next(); System.out.print("Descrição: " + item.getDescricao()); System.out.println(" Preço: " + item.getPreco()); }

felipegmc

Valew galera! :wink:
Mas é exatamente isso que eu não queria fazer…

Meu problema é que eu tenho uma classe com um método que devolve o próximo item da lista, usando o método next do iterator. Eu precisava criar um outro método, que acessaria o item que foi devolvido pelo next do método anterior (não sei se ficou confuso, mas foi o melhor que eu consegui explicar), e achei que seria desperdício de memória criar outro objeto na memória só para guardar esse valor…

ViniGodoy

Você não vai criar outro objeto, só outra referência ao objeto retornado. Isso significa… 4 bytes.
Sua máquina é tão restrita em memória assim!?!?!?

felipegmc

Hahahaha! Acho que a minha máquina agënta mais 4b sem ficar muito pesada sim! :smiley:
Mas já implementei a solução usando uma outra referencia para guardar o objeto retornado pelo iterator!
Mais umas vez, vallew galera!!!
:wink:

Criado 12 de setembro de 2008
Ultima resposta 13 de set. de 2008
Respostas 7
Participantes 3