Arrays 如何从一个数组中查找最远的3个连续元素

Arrays 如何从一个数组中查找最远的3个连续元素,arrays,swift,swift3,Arrays,Swift,Swift3,我有一个可能位置的数组和另一个填充位置的数组,它是可能位置数组的子数组PossiblePositionArray在数量上是固定的,并且已经确定。我想在filledPositions中找到所选数组元素x位置左右最远的3个连续点。让我用这个例子进一步解释。 说 两者都是CGPoints的数组,都具有相同的y位置,并按升序排列。 如果我选择了p11.x,以下将是右侧和左侧的3个连续点 [p7, p8, p9] and [p8, p9, p10] To the Left of p11 [p12, p13

我有一个可能位置的数组和另一个填充位置的数组,它是
可能位置数组的子数组
PossiblePositionArray
在数量上是固定的,并且已经确定。我想在
filledPositions
中找到所选数组元素x位置左右最远的3个连续点。让我用这个例子进一步解释。 说

两者都是
CGPoint
s的数组,都具有相同的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]

如何实现这一点?

首先从
填充位置开始。从
possiblePositionArray
中的
filledPositions
中查找第一项。检查两个数组中的下两项是否匹配。第一个连续的组是选定图元左侧最远的组。即使
possiblePositionArray
元素中的
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
        }
    }
}
让selectedElement=yourSelectedElement
//左连续组
var consleet=[CGPoint]()
//右连续群
var consRight=[CGPoint]()
如果filledPositions.count>=3{
对于0中的i..selectedElement.x&&
filledPositions[i-1].x==PossiblePositionArray[IndexInPossiblePositionArray-1].x&&
filledPositions[i-2].x==PossiblePositionArray[IndexInPossiblePositionArray-2].x{
对于i-2中的j…i{
consRight.append(filledPositions[j])
}
打破
}
}
}

从数组末尾开始,然后向后计数。您找到的第一个连续分组是数组中最远的分组。您编写的
y
对于所有项目都是相同的。对吗?如果是这样的话,那么可能只处理邮件中的x个值。是否将
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
        }
    }
}