Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中迭代时删除问题_Java - Fatal编程技术网

在java中迭代时删除问题

在java中迭代时删除问题,java,Java,我想实现一种方法攻击,其工作原理如下:我的部队中的每个战士攻击随机从另一个部队中选择的战士。如果被攻击的战士死亡,必须将其从部队中移除。使用我尝试的方法,我得到了随机数的错误: java.lang.IllegalArgumentException: n must be positive 这支部队是一列战士;我认为我没有正确地执行删除操作,因为否则我就不会出现该错误 public void atac(Troop opponentTroop){ for(Creature f :

我想实现一种方法攻击,其工作原理如下:我的部队中的每个战士攻击随机从另一个部队中选择的战士。如果被攻击的战士死亡,必须将其从部队中移除。使用我尝试的方法,我得到了随机数的错误:

 java.lang.IllegalArgumentException: n must be positive
这支部队是一列战士;我认为我没有正确地执行删除操作,因为否则我就不会出现该错误

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);
}
public void atac(部队对手战术){
对于(生物f:战士){
生物c=获得对手(对手进攻);
f、 atac(c);
ListIterator迭代器=opponentTroop.warriors.ListIterator();
while(iterator.hasNext()){
c=迭代器.next();
if(c.isDead()){
iterator.remove();
}
}   
}       
}
私人生物获得对手(部队对手){
intx=rand.getRandomArrayIndex(对手.战士.大小());
返回对手。勇士。获得(x);
}

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

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();                  
    }
}   
while(iterator.hasNext()){
c=迭代器.next();
if(c.isDead()){
//生成一个临时迭代器
ListIterator toDelete=c;
//一步一步地走
c=迭代器.next();
//除去
toDelete.remove();
}
}   

另外,请确保
intx=rand.getRandomArrayIndex(对手.战士.大小())
从不超过最后一个索引(即条目数减去一个

您能告诉我们引发异常的那一行吗(请参阅Stacktrace)?从哪里抛出
IllegalArgumentException
?我不认为它是标准Java错误消息,因此它可能是由应用程序的其他部分抛出的。问题可能不是迭代,而是一般的逻辑。我想我会选择将死去的对手添加到新列表中。在额外的循环中,死去的对手将可能需要对死去的对手做更多的事情,比如为所有死去的人制作动画或者做其他事情bodies@Raymondvan Dongelen:实际上不需要额外的循环。她可以直接调用
opponentTroop.warriors.removeAll(toDelete)