以组件方式对两个NSArray执行算术运算?

时间:2012-01-27 14:55:06

标签: iphone objective-c arrays

我有两个NSArray对象,我想以组件方式将两个数组一起添加到一起,这样索引i的array1中的int被添加到索引i的数组2中的int,结果被添加到一个新数组。有没有比使用标准for(int i = 0; i< [array1 count]; i ++)类型方法更快的方法?例如,你可以使用c数组,快速枚举,块吗?我特别感兴趣,因为我想添加x个包含大量对象的数组。我目前的代码如下:

    NSArray *array1 = [NSArray arrayWithObjects:
                   [NSNumber numberWithInt:1],
                   [NSNumber numberWithInt:2],
                   [NSNumber numberWithInt:3],
                   [NSNumber numberWithInt:4],
                   nil];

NSArray *array2 = [NSArray arrayWithObjects:
                   [NSNumber numberWithInt:10],
                   [NSNumber numberWithInt:20],
                   [NSNumber numberWithInt:30],
                   [NSNumber numberWithInt:40],
                   nil];

NSMutableArray *resultArray = [[NSMutableArray alloc] initWithCapacity:[array1 count]];

for (int i=0; i<[array1 count]; i++) {
    int result = [[array1 objectAtIndex:i] intValue] + [[array2 objectAtIndex:i] intValue];
    [resultArray addObject:[NSNumber numberWithInt:result]];                                
} 

谢谢,我感谢任何评论。

2 个答案:

答案 0 :(得分:1)

这是使用块和并发枚举执行此操作的示例:

NSArray *array1 = [NSArray arrayWithObjects:
                   [NSNumber numberWithInt:1],
                   [NSNumber numberWithInt:2],
                   [NSNumber numberWithInt:3],
                   [NSNumber numberWithInt:4],
                   nil];

NSArray *array2 = [NSArray arrayWithObjects:
                   [NSNumber numberWithInt:10],
                   [NSNumber numberWithInt:20],
                   [NSNumber numberWithInt:30],
                   [NSNumber numberWithInt:40],
                   nil];

NSMutableArray *resultArray = [[NSMutableArray alloc] initWithCapacity:[array1 count]];
for (int i=0; i<[array1 count]; i++) {
    [resultArray addObject:[NSNull null]];
}

dispatch_queue_t resultArrayQueue = dispatch_queue_create("com.yourcompany.appname.resultsArrayQueue", DISPATCH_QUEUE_SERIAL);

[array1 enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    int num1 = [(NSNumber *)obj intValue];
    int num2 = [[array2 objectAtIndex:idx] intValue];
    NSNumber *result = [NSNumber numberWithInt:(num1 + num2)];
    dispatch_async(resultArrayQueue, ^{
        [resultArray replaceObjectAtIndex:idx withObject:result];
    });
}];

NSLog(@"Result array: %@", resultArray);

是否更快还需要分析才能确定。我的预感是它不是更快,甚至可能因为(相对较小但仍然存在)GCD调度的开销而变慢。但是,对于比简单加法更复杂的计算,这使您可以了解如何使用并发枚举以多核感知的方式轻松地对数组中的每个元素执行某些操作。

如果在顶级数组中有x个数组(如注释中所述),则可以使用以下内容替换-enumerateObjectsWithOptions:usingBlock:call:

dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(numberOfItemsInEachArray, globalQueue, ^(size_t idx) {
    NSInteger sum = 0;
    for (NSArray *array in parentArray) {
        sum += [[array objectAtIndex:idx] integerValue];
    }

    NSNumber *result = [NSNumber numberWithInteger:sum];
    dispatch_async(resultArrayQueue, ^{
        [resultArray replaceObjectAtIndex:idx withObject:result];
    });
});

dispatch_apply()是一个Grand Central Dispatch函数,只需运行指定次数的代码块。由于我们告诉它使用我们用dispatch_get_global_queue()得到的全局并发队列,它可以同时运行块的不同调用,从而在多核机器上提供(可能的)性能优势。与大多数编程问题一样,还有很多其他方法可以解决这个问题。这只是我想到的一个。

答案 1 :(得分:0)

如果你想总结它们,你真的无法绕过两个阵列至少一次。但是,您可以将数组视为矩阵。在这种情况下,您可以使用一些极快的矩阵算术算法或库。