【发布时间】:2016-07-19 03:29:54
【问题描述】:
我在遍历这个迭代器循环时遇到了一个问题,在这个循环中我遍历了 this.env 的每个元素,但是在这个列表中,想要删除所述列表的不同元素。当我尝试删除所述迭代列表的任何项目时,我收到此错误:java.util.ConcurrentModificationException,据我了解,这是由于修改迭代列表而不使用 iterator.remove ()。
代码:
public void envActions(IOHandler ioHandler, PlayerClass player){
Iterator<WorldElement> worldElementIterator = this.env.iterator();
while(worldElementIterator.hasNext()){
WorldElement worldElement = worldElementIterator.next();
//for(WorldElement worldElement:this.env){
if(worldElement instanceof EntityClass){
EntityClass entity=(EntityClass) worldElement;
if(entity.nature.contains("hostile")){
MonsterClass mEntity=(MonsterClass) entity;
if(!(mEntity.attacks.size()*(Math.random()+0.25)>=mEntity.attacks.size())){
Double followerNum = (Math.random()*player.followers.size());
Integer followerNumInt=followerNum.intValue();
if(followerNumInt<2){
PlayerClass target=player;
Double attacknumD=mEntity.attacks.size()*Math.random();
Integer attacknum= attacknumD.intValue();
Integer playerarmor=player.getArmorValue();
int enemydamage=mEntity.attacks.get(attacknum).getDamage()*(1-(playerarmor/1000));
target.health=target.health-enemydamage;
ioHandler.printToConsole("\nThe "+mEntity.name+" attacked you with "+mEntity.attacks.get(attacknum).getAttack()+" and did "+mEntity.attacks.get(attacknum).getDamage()+" damage! you have "+player.health+" health left!");
} else {
FriendlyCreatureClass target=player.followers.get(followerNumInt);
Double attacknumD=mEntity.attacks.size()*Math.random();
Integer attacknum= attacknumD.intValue();
int enemydamage=mEntity.attacks.get(attacknum).getDamage();
target.health=target.health-enemydamage;
if(!target.isAlive()){
ioHandler.printToConsole("\nThe " + mEntity.name + " attacked " + target.name + " with " + mEntity.attacks.get(attacknum).getAttack() + " and did " + mEntity.attacks.get(attacknum).getDamage() + " damage! " + target.name+" died! Farewell "+target.name+".");
target.died(ioHandler, this, player, true);
//>>>> THIS IS WHERE I WOUlD LIKE TO REMOVE 'target' FROM THE env LIST <<<<
} else {
ioHandler.printToConsole("\nThe "+mEntity.name+" attacked "+target.name+" with "+mEntity.attacks.get(attacknum).getAttack()+" and did "+mEntity.attacks.get(attacknum).getDamage()+" damage! "+target.name+" has "+target.health+" health left!");
}
}
}
请原谅我的编码技巧,因为我只是 java / Android 的初学者,但非常感谢任何建议!
提前致谢!
【问题讨论】:
-
你为什么没有尝试 worldElementIterator.remove() ?
-
这不会删除迭代器本身吗?我想删除列表中的自定义元素...
-
不,我在下面为您回答。它删除最近访问的元素,在您的情况下,worldElement 已从集合中删除。迭代器没有被删除,它是元素。
-
您正在尝试删除与
Iterator的当前元素 (worldElement) 不同的元素 (target)。这是一个非常不寻常的情况。这些元素在列表中如何相互关联?例如。target总是在worldElement的左边吗? -
@PaulBoddington 是的,这正是我的问题,没有随机选择目标...
标签: java android iterator listiterator