迭代一个集合
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 方法和属性也不是最好的选择(但因为它看起来像一个游戏...)
我在通过包含对象的 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 方法和属性也不是最好的选择(但因为它看起来像一个游戏...)