2016-09-27 7 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' सभी वस्तुओं के लिए समान है। क्या वो सही है? यदि ऐसा है तो शायद आपके पोस्ट – neoneye

+0

में एक्स मानों के साथ ही काम करें क्या 'x' मान समान रूप से अलग हैं? – chronos

उत्तर

1

पहली बार filledPositions की शुरुआत से शुरू होता है। filledPositions से possiblePositionsArray में पहला आइटम ढूंढें। जांचें कि दोनों सरणी के अगले दो आइटम एक-दूसरे से मेल खाते हैं या नहीं। पहला समूह आपके चयनित तत्व के बाईं ओर सबसे दूर है। यह possiblePositionsArray तत्वों में मानों को समान रूप से अलग नहीं किया गया है, भले ही यह काम करता है।

इसके बाद आप इसे सही से दूर करने के लिए उलट क्रम में ऐसा करते हैं।

उस के लिए कोड कुछ इस तरह होगा: सरणी के अंत में

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 
     } 
    } 
} 
संबंधित मुद्दे