我正在尝试实现一种算法,以在我的应用程序中生成BSP树。我遇到的问题是我需要遍历每个“父”的所有“子”,然后拆分它们并将这些子项添加到列表中,并继续遍历子项。
我在使用并发修改时失去了如何做到这一点。
public void generate() {
Parent root = new Parent(0, 0, width, height);
parents.add(root);
boolean did_split = true;
while (did_split) {
did_split = false;
for (Parent p : parents) {
if (p.leftChild == null && p.rightChild == null) {
if (p.width > MAX_SIZE || p.height > MAX_SIZE || Math.random() > 0.25) {
if (p.split()) {
parents.add(p.leftChild);
parents.add(p.rightChild);
did_split = true;
}
}
}
}
}
}
parents是一个早期在类中定义的ArrayList。
答案 0 :(得分:2)
由于您已获得ArrayList
,因此可以使用其ListIterator
。正如您无法使用普通Iterator
(这是增强型for在幕后使用的内容)迭代的内容中添加新值,使用ListIterator
将允许您访问add
方法。
你还需要做更多的工作才能让它在你期望的地方插入东西;也就是说,你必须将光标向后移动一个位置,以便迭代可以继续(因为你是否在你的迭代器中有一个元素继续迭代时受到限制。
for (ListIterator<Parent> iterator = parents.listIterator(); iterator.hasNext(); ) {
Parent p = iterator.next();
if (p.leftChild == null && p.rightChild == null) {
if (p.width > MAX_SIZE || p.height > MAX_SIZE || Math.random() > 0.25) {
if (p.split()) {
parents.add(p.leftChild);
iterator.previous();
parents.add(p.rightChild);
iterator.previous();
did_split = true;
}
}
}
}