2016-09-27 52 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 
     } 
    } 
} 
相关问题