迭代一个集合

Iteration over a Set

我在通过包含对象的 Set 完成迭代(和修改)时遇到问题。我已经尝试了很多迭代方法 (4),但是其中 none 似乎有效并且仍然抛出错误 java.util.ConcurrentModificationException

[代码写在Groovy]

private void replaceRock() {
    ObjectNodeManager.OBJECTS.each {
        System.out.println("Going...");
        if(it.getPosition().withinDistance(player.getPosition(), 30)) {
            System.out.println("Found...");
            Position position = it.getPosition();
            ObjectNode newRock = new ObjectNode(439, position, ObjectDirection.NORTH, ObjectType.DEFAULT);
            ObjectNodeManager.unregister(it);
            ObjectNodeManager.register(newRock);
            it.remove();
        }
    }
}

我试过同步来阻止其他线程的访问,但这也没有用。请帮助我,我很绝望。

问题是您在循环访问对象时修改了对象列表。

尝试遍历对象的副本。

ArrayList<YourType> copy = new ArrayList<YourType>(ObjectNodeManager.OBJECTS);
copy.each(...)

首先找到它们(这基本上会给你一个参考列表)然后处理它们:

ObjectNodeManager.OBJECTS.findAll {
    it.getPosition().withinDistance(player.getPosition(), 30))
}.each{
    ObjectNode newRock = new ObjectNode(439, it.position, ObjectDirection.NORTH, ObjectType.DEFAULT)
    ObjectNodeManager.unregister(it)
    ObjectNodeManager.register(newRock)
    it.remove()
}

在随机站点上注意:我会在 ObjectNodeManager 中添加一个 replace 方法来组合注销、注册、删除。使用 class 方法和属性也不是最好的选择(但因为它看起来像一个游戏...)