2015-12-06 52 views
0

有沒有辦法將兩個陣列一起使用Apple提供的任何庫或方法到zip兩個陣列?Objective-C Zip等效

舉例來說,如果我有以下陣列

NSArray *one = @[@"foo", @"bar", @"bannana"]; 
NSArray *two = @[@"zebra", @"dog", @"cat"]; 

我想要的結果是

@[@"foo", @"zebra", @"bar", @"dog", @"bannana", @"cat"] 

我知道我可以簡單地循環過它們,並將它們添加到另一個陣列,但我想知道是否有更好的方法來做到這一點。我並不擔心表演。

您可以假定這些數組的長度相同。

編輯:

我現在看到的我是弄錯了zip功能,那天我正在尋找在這裏也許可以結合flatten來實現。

(我不得不使用的Objective-C)

+0

他們需要這樣的命令嗎?或者它可以只是一個附加? – brandonscript

+0

他們需要訂購。 – hhanesand

+0

什麼定義了訂單?沒有(內置的)編程方式來排列它們,因爲它不是按字母順序排列的。另外,如果你在談論Python ['zip'](http://stackoverflow.com/questions/4856717/javascript-equivalent-of-pythons-zip-function),這看起來並不一樣數組操作。 – brandonscript

回答

2

沒有任何內置,但我認爲這會做(未經測試):

+ (NSArray *)flattenArray:(NSArray *)array1 withArray:(NSArray *)array2 
{ 
    NSMutableArray *flattened = [NSMutableArray new]; 
    NSUInteger array1Count = [array1 count]; 
    NSUInteger array2Count = [array2 count]; 
    NSUInteger i; 
    for (i = 0; i < array1Count && i < array2Count; i++) { 
     [flattened addObject:array1[i]]; 
     [flattened addObject:array2[i]]; 
    } 
    NSArray *overflow = nil; 
    NSUInteger overflowCount = 0; 
    if (array1Count >= i) { 
     overflow = array1; 
     overflowCount = array1Count; 
    } else if (array2Count >= i) { 
     overflow = array2; 
     overflowCount = array2Count; 
    } 
    if (overflow) { 
     for (; i < overflowCount; i++) 
      [flattened addObject:overflow[i]]; 
    } 
    return flattened; 
} 
2

它的缺席Objective- C。肯定會給trojanfoe打勾。蘋果已經解決了在Swift中的遺漏,但是你已經非常明確地表示這不是一個選項。所以,在競選中寫下最新的zip

@implementation NSArray (Zip) 

- (NSArray *)zip:(NSArray *)secondArray { 
    NSMutableArray *result = [NSMutableArray arrayWithCapacity: 
                self.count + secondArray.count]; 

    NSEnumerator *secondArrayEnumerator = [secondArray objectEnumerator]; 
    [self enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop) { 
     [result addObject:object]; 
     id pairObject = [secondArrayEnumerator nextObject]; 
     if (pairObject) [result addObject:pairObject]; 
    }]; 

    if ([secondArrayEnumerator nextObject]) { 
     [result addObjectsFromArray: 
      [secondArray subarrayWithRange: 
       NSMakeRange(self.length, 
          secondArray.length-self.length)]]; 
    } 

    return [result copy]; 
} 

@end