2012-11-27 47 views
0

是否有一種簡單的方法可以將序列中的數字轉換爲數組?Objective-C - 將數組數組轉換爲數組,並按順序編號

NSArray *numbers = @[@1,@2,@5,@3]; 

// Transformed arrays 
//NSArray *numbersInSequence = @[@1,@2,@3]; 
//NSArray *numbersInSequence2 = @[@5]; 

編輯:

我修改了代碼中Richard's answer來得到它的工作。

NSArray *arraysBySplittingNumbersInOrder(NSArray *input) { 

// sort 'input' 
input = [input sortedArrayUsingSelector:@selector(compare:)]; 

NSMutableArray *results = [NSMutableArray array]; 

if (input.count) { 

    int start = 0; 
    int last = INT_MIN; 

    for (int i = 0; i < input.count; i++) { 

     BOOL lastItem = i == input.count - 1; 

     // The first item of the array 
     if (i == 0) { 

      if (lastItem) { 
       [results addObject:input]; 
       break; 
      } 

      last = [input[i] intValue]; 
      continue; 
     } 

     int cur = [input[i] intValue]; 

     if (cur != last + 1) { 

      // pull out the next array 
      [results addObject:[input subarrayWithRange:NSMakeRange(start, i - start)]]; 

      start = i; 
     } 

     // The last item of the array 
     if (lastItem) { 

      [results addObject:[input subarrayWithRange:NSMakeRange(start, i - start + 1)]];    
     } 

     last = cur; 
    } 
} 

return results; 
} 
+0

你可以在這裏找到答案:http://stackoverflow.com/questions/805547/how-to-sort- an-nsmutablearray -with-custom-objects-in-it – Dave

+0

@Dave不,這不是必要的。他只需要使用內置的'-compare:'選擇器對其進行排序,然後遍歷數組一次。 –

回答

0

這是一個相當簡單的解決方案:

NSArray *arraysBySplittingNumbersInOrder(NSArray *input) 
{ 
    // sort 'input' 
    input = [input sortedArrayUsingSelector:@selector(compare:)]; 

    NSMutableArray *results = [NSMutableArray array]; 

    if (input.count) 
    { 
     int start = 0; 
     int last = INT_MIN; 

     for (int i = 0; i <= input.count; i++) 
     { 
      if (i == 0) 
      { 
       last = [input[i] intValue]; 
       continue; 
      } 
      if (i == input.count) 
      { 
       if (i != start + 1) 
       { 
        [results addObject:[input subarrayWithRange:NSMakeRange(start, i - start)]]; 
        continue; 
       } 
      } 

      int cur = [input[i] intValue]; 

      if (cur != last + 1) 
      { 
       // pull out the next array 
       [results addObject:[input subarrayWithRange:NSMakeRange(start, i - start)]]; 
       start = i; 
      } 

      last = cur; 
     } 
    } 

    return results; 
} 

int main() 
{ 
    NSArray *input = @[ @1, @3, @4, @7, @8, @12, @13, @14 ]; 

    NSLog(@"%@", input); 
    NSLog(@"%@", arraysBySplittingNumbersInOrder(input)); 
} 

輸出:

 
2012-11-27 07:55:04.609 TestProj[35890:303] (
    1, 
    3, 
    4, 
    7, 
    8, 
    12, 
    13, 
    14 
) 
2012-11-27 07:55:04.611 TestProj[35890:303] (
     (
     1 
    ), 
     (
     3, 
     4 
    ), 
     (
     7, 
     8 
    ), 
     (
     12, 
     13, 
     14 
    ) 
) 
+0

太棒了!那很快!謝謝。 –

+0

@PeterWarbo如果有幫助,不要忘記接受答案。 :) –

+0

@Richard ...嗯它炸燬了我...不應該是'for(int i = 0; i

0

我不認爲有一個簡單的辦法做到這一點;你可能必須自己完成至少部分工作。

我的建議是對數組進行排序,然後遍歷數組,然後繼續構建這些部分。每當你點擊一個「跳躍」,即一個非連續的數字,這就結束你當前的部分並開始一個新的部分。