2016-09-27 48 views
5

我有一個可能的位置數組和另一個填充位置數組,這是possiblePositionsArray的子數組。 possiblePositionsArray已固定並已確定。我想找到filledPositions中選定數組元素的x位置右側和最右側的最遠的3個連續點。讓我用這個例子進一步解釋。 說如何從數組中找到最遠的3個連續元素

possiblePositionsArray = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15] 
filledPositions = [p1, p2, p4, p7, p8, p9, p10, p12, p13, p14, p15] 

兩者都是CGPoint小號陣列和所有具有相同的y位置,並且以升序排列。 如果我選擇p11.x,以下將是連續3個點向右和向左。

[p7, p8, p9] and [p8, p9, p10] To the Left of p11 
[p12, p13, p14] and [p13, p14, p15] to the right of p11 

但最左邊和右邊是:

farthest to left of p11 is [p7, p8, p9] 
farthest to right of p11 is [p13, p14, p15] 

我怎樣才能做到這一點?

+0

開始在數組的結束和倒數。您發現的第一個連續分組是陣列中最遠的一個分組。 – DejaVuSansMono

+0

你寫的'y'對所有項目都是一樣的。那是對的嗎?如果是這樣,那麼也許只能在你的文章中使用x值 – neoneye

+0

「x」值是否等距分開? – chronos

回答

1

filledPositions開始的第一個開始。在possiblePositionsArray中查找filledPositions中的第一項。檢查兩個陣列中的下兩個項目是否相互匹配。第一個連續的組是您所選元素的最左邊。即使possiblePositionsArray元素中的x值沒有相等的間距,這也可以工作。

之後,以相反的順序執行此操作,以找到最靠右的位置。

操作的代碼會是這樣的:

let selectedElement = yourSelectedElement 

//left consecutive group 
var consLeft = [CGPoint]() 
//right consecutive group 
var consRight = [CGPoint]() 

if filledPositions.count >= 3 { 
    for i in 0..<filledPositions.count-2 { 
     // find the index of the element from filledPositions in possiblePositionsArray 
     let indexInPossiblePostionArray = possiblePositionsArray.indexOf(filledPositions[i])! 

     if indexInPossiblePostionArray < possiblePositionsArray.count-2 && // safety check 
      filledPositions[i+2].x < selectedElement.x && // Only check left of selected element 
      //check equality of second items 
      filledPositions[i+1].x == possiblePositionsArray[indexInPossiblePostionArray+1].x && 
      //check equality of third items 
      filledPositions[i+2].x == possiblePositionsArray[indexInPossiblePostionArray+2].x { 
      //3 consecutive elements to left selected element was found 
      for j in i...i+2 { 
       //add to left consecutive group 
       consLeft.append(filledPositions[j]) 
      } 
      //break out of the for loop 
      break 
     } 
    } 

    //The same thing in reversed order 
    for i in (2..<filledPositions.count).reverse() { 
     let indexInPossiblePostionArray = possiblePositionsArray.indexOf(filledPositions[i])! 

     if indexInPossiblePostionArray-2 >= 0 && 
      filledPositions[i-2].x > selectedElement.x && 
      filledPositions[i-1].x == possiblePositionsArray[indexInPossiblePostionArray-1].x && 
      filledPositions[i-2].x == possiblePositionsArray[indexInPossiblePostionArray-2].x { 
      for j in i-2...i { 
       consRight.append(filledPositions[j]) 
      } 
      break 
     } 
    } 
} 
相關問題