Stack Overflow以递归方法创建层次结构

时间:2014-06-13 17:02:52

标签: java stack-overflow

假设我有一个这样的图像(数字用于解释,所以专注于白色): example image

我正在研究一种方法来创建轮廓的层次结构而不是平面列表。如上图所示:

-n1 holds 1 contour: n2 
-n2 hold 3 contours: n3, n4, n5 
-n5 holds 1 contour: n6 
-n6 holds 1 contour: n7

在继续阅读之前,请确保您已理解上述内容。

我有方法addContainingBlob,这个方法在blob类中。如果blobToAdd在我添加它的blob的范围内,我已经检查了另一种方法。我在此行收到StackOverflowErrorb.addContainingBlob(blobToAdd); // <<<<<<

我在最后一小时打破了这个局面。有人能看出为什么会出错吗?

protected void addContainingBlob(Blob blobToAdd) {

    if (containingBlobs.size() == 0) {
        containingBlobs.add(blobToAdd);
        return;
    }

    Rectangle r1 = new Rectangle();
    r1.setBounds(blobToAdd.minX(), blobToAdd.minY(), blobToAdd.width(), blobToAdd.height());

    Rectangle r2 = new Rectangle();

    // first check if we already have a containing blob that
    // can hold the one we like to add
    for (Blob b : containingBlobs) {
        r2.setBounds(b.minX(), b.minY(), b.width(), b.height());

        if (r2.contains(r1)) {
            b.addContainingBlob(blobToAdd); // <<<<<<
            return;
        }

    }

    // it can also be that one OR MORE of the containing blobs can fit in the blob we like to add
    for (int i = containingBlobs.size()-1; i >= 0; i--) {
        Blob b = containingBlobs.get(i);
        r2.setBounds(b.minX(), b.minY(), b.width(), b.height());

        if (r1.contains(r2)) {
            containingBlobs.remove(i);
            blobToAdd.addContainingBlob(b);
        }

    }
    containingBlobs.add(blobToAdd);
}

1 个答案:

答案 0 :(得分:2)

如果代码允许blob包含自身,则对blobToAdd.addContainingBlob(b)的调用将导致无限递归,因为

    if (r2.contains(r1)) {
        b.addContainingBlob(blobToAdd); // <<<<<<
        return;
    }