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

时间:2014-05-16 01:37:10

标签: java iterator matching

我正在开发一个匹配的游戏(用Java),玩家抛出并对象,系统将检查它是否与棋盘上的任何相邻棋子相匹配。我目前能够检查一个相邻的部分(使用矩形交叉点),但是如果我在if / else块之后没有return;(从而阻止它检查多个相邻的部分),它将抛出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;
            }
        }
    }

请注意it是&#39;抛出&#39;迭代器和it2是用于停止抛出的碎片的第一次碰撞检查。投掷是投掷,食物是游戏片。

如果我写的内容令人困惑,我很抱歉。我非常乐意澄清任何事情。基本上我的问题归结为如何多次迭代匹配(单独或一次),因为匹配可以在throw的任何一侧,并且多个对象可以匹配。

1 个答案:

答案 0 :(得分:0)

无法理解您的代码(请参阅我的评论),我可以告诉您问题所在。如果您阅读ConcurrentModificationException实际上是什么,您将进入解释的部分

  

[...]如果一个线程在使用失败快速迭代器迭代集合时直接修改集合,迭代器将抛出此异常。

您正在使用it3进行迭代,然后调用it3.remove()