在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)