List.add() enquanto estou usando Iterator.next()

10 respostas
dudaskank

Olá pessoal do GUJ

Estou com um pequeno problema… estou criando um framework para jogos em Java aqui para a minha monografia (ou pelo menos tentando), e minha classe Game possui uma lista com todos os objetos do jogo.

Tem nela também um método para atualizar os objetos conforme o tempo passa no jogo… até aí tudo certo.

Esses dias fui tentar adicionar um novo objeto na lista durante este método update, mas deu erro porque tentei modificar a lista durante a utilização de um Iterator… a solução que encontrei foi criar duas listas temporárias, uma para adicionar e outra para remover objetos da lista principal, e o código ficou assim:

/** * Método que atualiza os <code>GameObject</code>s do jogo * @return Se atualizou o jogo true, false se não foi preciso atualizar. */ public boolean updateGame() { long newTime; float deltaT; Iterator iterator; GameObject actor; if (oldTime == -1) { oldTime = clock.getCurrentTime(); return true; } newTime = clock.getCurrentTime(); if (oldTime != newTime) { /* adiciona e remove os objetos que se encontram nas listas de espera */ objectsList.addAll(addList); addList.clear(); objectsList.removeAll(removeList); removeList.clear(); deltaT = (float) (newTime - oldTime) / 1000; iterator = objectsList.iterator(); while (iterator.hasNext()) { actor = (GameObject) iterator.next(); actor.update(deltaT); } oldTime = newTime; return true; } else { return false; } }

Gostaria de saber de vocês se existem outros métodos, se possível mais eficientes, para se fazer isso.

Falou e obrigado :slight_smile:

10 Respostas

Rafael_Steil

Voce vai precisar de duas listas mesmo.

Rafael

jgbt

acho que se vc iterasse a lista com um for em vez de usar iterator funcionaria.
como vc implementou realmente precisa de duas listas.

[]'s

cv1

De qualquer maneira vc fica sujeito a ConcurrentModificationExceptions :wink:

jgbt
cv:
jgbt:
acho que se vc iterasse a lista com um for em vez de usar iterator funcionaria.
De qualquer maneira vc fica sujeito a ConcurrentModificationExceptions ;)
confesso que não analizei completamente o codigo passado, mas quando falei sobre modificar a lista falava em algo assim:
List lista = new ArrayList();
      lista.add("1");
      lista.add("2");
      lista.add("3");
      
      for(int i=0; i<lista.size(); i++) 
      {
        String x = (String)lista.get(i);
        if(x.equals("2")) 
        {
          lista.remove(i);
          lista.add("4");
        }
        System.out.println(lista.get(i));
      }
com iterator isso não funcionaria.

[]'s
>

Rafael_Steil

O teu codigo eh mto suscetivel a problemas de performance caso a implementacao de List nao seja um ArrayList. Por exemplo, um get(int) em uma LinkedList vai ser beeeem mais lento que um get(int) de um ArrayList.

Rafael

jgbt

Rafael Steil:
O teu codigo eh mto suscetivel a problemas de performance caso a implementacao de List nao seja um ArrayList. Por exemplo, um get(int) em uma LinkedList vai ser beeeem mais lento que um get(int) de um ArrayList.

Rafael


concordo, a performance ficaria comprometida se a implementação fosse como vc citou um LinkedList.
quando usei esse tipo de iteração, não eram em listas tão grandes, mas as modificações eram feitas dentro do laço.
o que eu queria confirmar é que se em algum momento eu corro o risco de receber uma ConcurrentModificationExceptions, como aconteceria se usasse iterator.

[]'s

dudaskank

Valeu pessoal… mais algumas dúvidas:

Mas qual código vocês dizem, o meu com o Iterator ou o usando get()? Acredito que seja o com o get(), mas não custa perguntar… inclusive eu usei o Iterator por causa disso mesmo, acredito que o Iterator seja mais rápido.

Também gostaria de saber se existe alguma implementação de lista ideal para o meu caso. Atualmente estou usando Vector mesmo, mas depois pretendo testar usando com ArrayList e uma LinkedList também, ou alguma outra… qual vocês recomendariam para mim?

jgbt

não use vector ao menos que vc precise sincronização no acesso.
vector tem seus metodos marcados como synchronized, por isso são mais lentos.
se vc precisa velocidade e não vai fazer inserções/modificações no meio da lista, ArrayList é a melhor opção, usando iterator.
flw!

[]'s

dudaskank

Ok… mas e no caso de eu precisar de velocidade mas quiser inserir e deletar da lista?

Por exemplo, no jogo que vou desenvolver, estou pretendo fazer com que o GameObject do jogador ao apertar uma tecla adicione GameObjects de tiro, e estes ao sairem da tela ou encostarem no inimigo devem ser removidos… e por aí vai…

:slight_smile:

Rafael_Steil

Se vc tem algum “identificador” para os objetos, utilize um HashMap. Vai ser bem mais rapido que usar um ArrayList.

Rafael

Criado 28 de fevereiro de 2005
Ultima resposta 1 de mar. de 2005
Respostas 10
Participantes 4