Objective-C Zip等效

时间:2015-12-06 20:34:18

标签: objective-c

有没有办法将Apple提供的任何库或方法用于zip两个阵列?

例如,如果我有以下数组

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

我希望结果是

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

我知道我可以简单地循环它们并将它们添加到另一个数组中,但我想知道是否有更好的方法来实现它。我并不担心表现。

您可以假设数组的长度相同。

编辑:

我现在看到我错误地认为zip函数,我在这里寻找的东西可能与flatten结合使用。

(我被限制使用objective-c)

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

目标-C不存在。绝对给木马队打勾。 Apple已经解决了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