有没有办法将Apple提供的任何库或方法用于zip
两个阵列?
例如,如果我有以下数组
NSArray *one = @[@"foo", @"bar", @"bannana"];
NSArray *two = @[@"zebra", @"dog", @"cat"];
我希望结果是
@[@"foo", @"zebra", @"bar", @"dog", @"bannana", @"cat"]
我知道我可以简单地循环它们并将它们添加到另一个数组中,但我想知道是否有更好的方法来实现它。我并不担心表现。
您可以假设数组的长度相同。
编辑:
我现在看到我错误地认为zip
函数,我在这里寻找的东西可能与flatten
结合使用。
(我被限制使用objective-c)
答案 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