对集合的迭代

时间:2015-04-14 18:50:14

标签: java groovy set

我遇到了通过包含对象的Set完成迭代(和修改)的问题。我已经尝试了很多迭代方法(4),但它们似乎都没有工作,仍然给我错误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();
        }
    }
}

我已尝试同步以防止从其他线程访问,但这也无效。请帮助我,我非常绝望。

2 个答案:

答案 0 :(得分:1)

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

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()
}

在随机网站上注意:我在replace中添加ObjectNodeManager方法,以合并取消注册,注册,删除。使用类方法和属性也不是最好的事情(但因为它看起来像游戏......)

答案 1 :(得分:0)

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

尝试重复遍历对象的副本。

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