如何解决此ConcurrentModificationException

时间:2015-06-28 00:20:00

标签: java concurrentmodification

我正在尝试实现一种算法,以在我的应用程序中生成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。

1 个答案:

答案 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;
            }
        }
    }
}