递归地合并列表中的类似元素

时间:2015-01-05 13:23:14

标签: java list recursion

我想分组/合并/联合矩形彼此接近(相似)。没有特别的理由为什么我递归地试了这个,但这似乎是合适的。

但是我在这里遗漏了一些东西。输出不正确,我没有考虑到以后合并的矩形可能现在已接近我考虑的矩形"不可合并"并加入finalList

合并和检查接近方法正常工作。

public static ArrayList<Rect> mergeCloseRects(ArrayList<Rect> sourceList, ArrayList<Rect> finalList) {

    Rect rect = sourceList.get(0).clone();
    sourceList.remove(0);

    for (int i = 0; i < sourceList.size(); i++) {

        if (rectsAreClose(rect, sourceList.get(i)) {
            // put merged rectangle on top of the list
            sourceList.add(0, getMergeRect(rect, sourceList.get(i)));
            // remove rectangle that was merged with rect
            sourceList.remove(i + 1);
            mergeCloseRects(sourceList, finalList);
        }
    }

    // if rect has no close neighbours
    finalList.add(rect);

    return finalList;
}

输入

enter image description here

输出

enter image description here

正如您所看到的,矩形并未真正合并。下面的矩形留在列表中。绿色轮廓表示新矩形的位置。

1 个答案:

答案 0 :(得分:0)

在我看来,这比迭代更适合迭代:你可以自然地继续前进,直到没有任何东西可以合并。我认为您的代码应该类似于:

while(!getListCloseRectangles(sourceList).isEmpty()) {
    List<Rect> rectanglesToMerge = getListCloseRectangles(sourceList);
    sourceList.removeAll(rectanglesToMerge);
    sourceList.add(createMergedRect(rectanglesToMerge));
}

这也允许getListCloseRectangles一次返回两个以上矩形的情况。但如果它只返回列表中的两个项目,它仍然可以正常工作。