在java中迭代问题时删除

时间:2013-04-25 11:28:31

标签: java

我想实施一个像这样工作的方法攻击:来自我的部队的每个战士攻击从另一个部队随机选择的战士。如果受到攻击的战士死亡,必须将其从部队中移除。使用我尝试的方法我得到随机数的错误:

 java.lang.IllegalArgumentException: n must be positive

该部队是一个名单<Creature>战士;我认为我没有正确删除,因为否则我不会有这个错误。

public void atac(Troop opponentTroop){
        for(Creature f : warriors){
            Creature c = getOpponent(opponentTroop);
            f.atac(c);
            ListIterator<Creature> iterator = opponentTroop.warriors.listIterator();
            while(iterator.hasNext()){
                c = iterator.next();
                if(c.isDead()){
                    iterator.remove();                  
                }
            }   

        }       
    }


private Creature getOpponent(Troop opponent){
        int x = rand.getRandomArrayIndex(opponent.warriors.size());
        return opponent.warriors.get(x);
}

1 个答案:

答案 0 :(得分:0)

删除该条目会使迭代器无效。你需要保存它,你可以做这样的事情:

while(iterator.hasNext()) {
    c = iterator.next();
    if(c.isDead()) {
        // Make a temporary iterator
        ListIterator<Creature> toDelete= c;
        // Step the regular one
        c = iterator.next();
        // Remove
        toDelete.remove();                  
    }
}   

另外,请确保int x = rand.getRandomArrayIndex(opponent.warriors.size());永远不会超出最后一个索引(这是减去一个的条目数。