2015-01-05 73 views
0

我想組合/合併/相互接近(相似)的矩形。爲什麼我遞歸地嘗試這個沒有特別的理由,但它似乎是合適的。遞歸合併列表中的相似元素

但是我很想念這裏的東西。輸出是不正確的,我沒有考慮到這樣一個事實,即後來合併的矩形可能現在接近我認爲「不可合併」的矩形,並將其放入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

正如你所看到的矩形沒有真正合並。下方的矩形留在列表中。綠色輪廓表示新矩形的位置。

回答

0

在我看來,這似乎更適合迭代而不是遞歸:您可以自然地繼續前進,直到沒有什麼可以合併爲止。我想你的代碼應該是這個樣子:

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

這也使得在getListCloseRectangles可以一次返回多於兩個矩形的情況。但如果它只返回列表中的兩個項目,它仍然可以正常工作。