在Java中迭代ArrayList时检查多个冲突
我正在制作一个匹配的游戏(Java),玩家在游戏中投掷物体,系统将检查它是否匹配棋盘上任何相邻的棋子。我目前能够让它检查一个相邻的工件(使用矩形交点),但如果我不在Java中迭代ArrayList时检查多个冲突,java,iterator,matching,Java,Iterator,Matching,我正在制作一个匹配的游戏(Java),玩家在游戏中投掷物体,系统将检查它是否匹配棋盘上任何相邻的棋子。我目前能够让它检查一个相邻的工件(使用矩形交点),但如果我不返回在if/else块之后(从而防止它检查多个相邻的块),它将抛出java.util.ConcurrentModificationException异常。我还没能想出任何办法来做这件事 我使用迭代器循环遍历所有片段,并检查它们是否与抛出的片段相交。该检查是在工件碰到某个物体后进行的(也通过矩形交点进行检查) 以下是问题区域的代码片段:
返回
在if/else块之后(从而防止它检查多个相邻的块),它将抛出java.util.ConcurrentModificationException
异常。我还没能想出任何办法来做这件事
我使用迭代器循环遍历所有片段,并检查它们是否与抛出的片段相交。该检查是在工件碰到某个物体后进行的(也通过矩形交点进行检查)
以下是问题区域的代码片段:
Iterator<Food> it3 = foods.iterator();
while(it3.hasNext()) {
Food f2 = it3.next();
if(t.checkAll().intersects(f2.getBounds())) { // check for matches
if(t.getNutritionType() == f2.getNutritionType() || t.getType() == 0) {
app.log("Throw intersects with like food.");
int numMatches = 2; // hard-coded until multiple matching works
player.addNutrient(f2.getNutritionType(), 1);
player.addCalories(10*numMatches);
// move food to cart and add to matched
f2.fallToCart(600, 540);
matched.add(f2);
// remove from food arraylist
it.remove();
it3.remove();
return;
} else {
app.log("Throw intersects with unlike food.");
t.stop();
Food n = new Food(t.getType());
n.setX(t.getX());
n.setY(t.getY());
foods.add(n);
it.remove();
return;
}
}
}
Iterator it3=foods.Iterator();
while(it3.hasNext()){
食品f2=it3.下一步();
如果(t.checkAll().intersects(f2.getBounds()){//检查匹配项
如果(t.getNutritionType()==f2.getNutritionType()| | t.getType()==0){
app.log(“投掷与类似食物相交”);
int numMatches=2;//硬编码,直到多个匹配起作用
player.add营养品(f2.getNutritionType(),1);
玩家。添加卡路里(10*次numMatches);
//将食物移动到购物车并添加到匹配的食物中
f2.下降法(600540);
匹配。添加(f2);
//从食物列表中删除
it.remove();
it3.删除();
返回;
}否则{
app.log(“投掷与不同食物相交”);
t、 停止();
食品n=新食品(t.getType());
n、 setX(t.getX());
n、 setY(t.getY());
添加(n);
it.remove();
返回;
}
}
}
请注意,it
是“抛出”迭代器,it2
是第一次与片段进行碰撞检查以停止抛出。投掷就是投掷,食物就是游戏
如果我写的东西令人困惑,我很抱歉。我非常乐意澄清任何事情。基本上,我的问题归结为如何多次(单独或一次)迭代匹配,因为匹配可以位于抛出的任意一侧,并且可以匹配多个对象。如果无法理解您的代码(请参阅我的注释),我可以告诉您问题出在哪里。如果您阅读了
ConcurrentModificationException
实际上是什么,您将看到它解释的部分
[…]如果线程在使用fail fast迭代器迭代集合时直接修改集合,迭代器将引发此异常
您正在使用it3
进行迭代,然后调用it3.remove()
参见tl;dr you(通常)在迭代集合时不能直接从集合中添加/删除内容(1)您的代码包含我们没有的类和函数,并且可能没有必要演示该问题。(2) 您谈论的是it2
,但它不在代码中。(3) 您没有给出整个堆栈跟踪,我们也不知道在哪一行抛出错误。张贴一封电子邮件。