Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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中迭代ArrayList时检查多个冲突_Java_Iterator_Matching - Fatal编程技术网

在Java中迭代ArrayList时检查多个冲突

在Java中迭代ArrayList时检查多个冲突,java,iterator,matching,Java,Iterator,Matching,我正在制作一个匹配的游戏(Java),玩家在游戏中投掷物体,系统将检查它是否匹配棋盘上任何相邻的棋子。我目前能够让它检查一个相邻的工件(使用矩形交点),但如果我不返回在if/else块之后(从而防止它检查多个相邻的块),它将抛出java.util.ConcurrentModificationException异常。我还没能想出任何办法来做这件事 我使用迭代器循环遍历所有片段,并检查它们是否与抛出的片段相交。该检查是在工件碰到某个物体后进行的(也通过矩形交点进行检查) 以下是问题区域的代码片段:

我正在制作一个匹配的游戏(Java),玩家在游戏中投掷物体,系统将检查它是否匹配棋盘上任何相邻的棋子。我目前能够让它检查一个相邻的工件(使用矩形交点),但如果我不
返回
在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) 您没有给出整个堆栈跟踪,我们也不知道在哪一行抛出错误。张贴一封电子邮件。