2016-09-27 12 views
5

Mam szereg możliwych pozycji i inną tablicę wypełnionych pozycji, która jest podprzestrzenią possiblePositionsArray. possiblePositionsArray jest ustalony i już ustalony. Chciałbym znaleźć najdalsze 3 kolejne punkty po prawej i lewej stronie wybranej pozycji x elementu tablicy w filledPositions. Pozwól mi wyjaśnić dalej za pomocą tego przykładu. Sayjak znaleźć najdalsze 3 kolejne elementy z tablicy

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] 

Oba układy CGPoint S i mają te same pozycje y i są rozmieszczone w porządku rosnącym. Jeśli wybiorę p11.x, następujące trzy punkty będą następujące po prawej i lewej stronie.

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

Ale najdalej na lewo i prawo byłoby:

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

W jaki sposób można to osiągnąć?

+0

start na końcu tablicy i liczyć wstecz. Pierwsza z następujących po sobie grup to najdalsza część tablicy. – DejaVuSansMono

+0

Piszesz, że "y" jest takie samo dla wszystkich elementów. Czy to jest poprawne? Jeśli tak, to może działa tylko z wartościami x w twoim poście. – neoneye

+0

Czy wartości 'x' są równo rozstawione? – chronos

Odpowiedz

1

Najpierw rozpocznij od początku filledPositions. Znajdź pierwszy element z filledPositions w possiblePositionsArray. Sprawdź, czy następne dwa elementy z obu tablic odpowiadają sobie nawzajem. Pierwsza z kolejnych grup znajduje się najdalej na lewo od wybranego elementu. Działa to nawet wtedy, gdy wartości x w elementach possiblePositionsArray nie są równomiernie rozmieszczone.

Następnie wykonaj to w odwrotnej kolejności, aby znaleźć najdalsze miejsce po prawej stronie.

Kod dla że będzie coś takiego:

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 
     } 
    } 
} 
Powiązane problemy