2016-07-14 4 views
2

同時変更例外を回避しようとしています。エンティティHashMapをループして各エンティティをtick()します。 PlayerエンティティはWASD入力で画面を移動し、addNewEntity()メソッドをテストするには、プレーヤーが右に移動するときにGameState.addNewEntity(new Explosion(true, this.x, this.y));を呼び出します。いくつかの爆発がプレイヤーに表示され、その後エラーが発生します。 Player classはEntityを拡張するCreatureを拡張します。 ExplosionはEntityクラスを拡張します。同時変更例外を回避しようとしています

このコードは、私のGameStateクラスからです:

private static HashMap<Integer, Entity> entities = new HashMap<Integer, Entity>(); 
private static HashMap<Integer, Entity> newEntities = new HashMap<Integer, Entity>(); 

player = new Player(game, true, 100, 100); 
entities.put(0, player); 

マイダニ()メソッド:

public void tick() { 
    // add new elements from newEntities to entities, deleting from newEntities 
    for (Entry<Integer, Entity> entry : newEntities.entrySet()) { 
     entities.put(entities.size(), entry.getValue()); 
     newEntities.remove(entry.getValue()); 
    } 

    System.out.println(entities.size()); 

    // tick the updated entities HashMap 
    for (Entry<Integer, Entity> entry : entities.entrySet()) { 
     entry.getValue().tick(); 

     // remove dead entities 
     if (!entry.getValue().isAlive) { 
      entities.remove(entry.getKey()); 
     } 
    } 
} 

私addNewEntity方法:

public static void addNewEntity(Entity e) { 
    // add a new element to newEntities. 
    newEntities.put(newEntities.size(), e); 
} 

レンダリング私の方法:

public void render(Graphics g) { 
    for (Entry<Integer, Entity> entry : entities.entrySet()) { 
     entry.getValue().render(g); 
    } 
} 

エンティティHashMapに追加するのではなく、newEntities HashMapを追加することで、同時変更例外を回避しようとしました。私のダニ法では、newEntitiesのHashMapをループし、存在しない各項目をエンティティに追加し、それぞれを順番に削除します。その後、エンティティHashMapをループします。

反復処理中にマップを変更する方法はありますか?

答えて

1

拡張されたforループで繰り返し処理している間にマップからエントリを直接削除することはできません。代わりに、イテレータを明示的に使用し、イテレータのremove()メソッドを使用します。

Iterator<Map.Entry<Integer, Entity>> iter = newEntities.entrySet().iterator(); 
while (iter.hasNext()) { 
    Map.Entry<Integer, Entity> entry = iter.next(); 
    entities.put(entities.size(), entry.getValue()); 
    iter.remove(); 
} 

2番目のループでも同じ操作を行います。

+0

ありがとうございます。魅力のように働いた。 – Fabced

関連する問題