簡體   English   中英

迭代時將游戲對象添加到列表中

[英]Adding game object to list while iterating over it

我需要將游戲對象添加到列表中。 在這個private ArrayList<GameObject> list; list 我保存了我所有的游戲數據(敵人、方塊、磚塊等等……)。 在這里我如何做到這一點

for(GameObject t : list){
    if(Enemy.count < 20){
        list.add(new Enemy(100, 100, true));
    }
}

我得到這個例外

Exception in thread "LWJGL Application" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)

此代碼可以重寫

   for(GameObject t : list){
        if(Enemy.count < 20){
            list.add(new Enemy(100, 100, true));
        }
    }

作為

if(Enemy.count < 20){
for(int i=0;i<list.size();i++){
            list.add(new Enemy(100, 100, true));
}}

另一種解決方案是暫時使用另一個列表:

List<GameObject> toAdd = new ArrayList<>();
for(GameObject t : list){
  if(Enemy.count < 20){
    toAdd.add(new Enemy(100, 100, true));
  }
}
list.addAll(toAdd);

當您嘗試在迭代列表時修改列表時,您將收到 java.util.ConcurrentModificationException 異常。

- 如果目的只是刪除對象,請使用迭代器而不是直接迭代它。 但我明白了,你需要添加它們,因此使用第二種方法

Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    String str = iter.next();
    if (str.equals("B")) {
        iter.remove();
    }
}

- 使用 CopyOnWriteArrayList 而不是簡單的 ArrayLists,您可以按原樣使用現有代碼。

List<GameObject> list = new CopyOnWriteArrayList<GameObject()>;
for (GameObject t : list) {
    if (Enemy.count < 20) {
        list.add(new Enemy(100, 100, true));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM