2012-01-27 70 views
0

我有兩個NSArray對象,我想以組件明智的方式將兩個數組一起添加到索引i的array1中的int,並將索引i中的int添加到數組2中,並將結果添加到新數組中。有沒有更快的方法來做這件事比標準的for(int i = 0; i < [array1 count]; i ++)類型的方法?例如,你可以使用c數組,快速枚舉,塊嗎?我特別感興趣,因爲我想添加x個包含大量對象的數組。我目前的代碼如下:以分量方式對兩個NSArray進行算術運算?

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]];         
} 

謝謝,我很欣賞任何意見。

回答

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:

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()獲得的全局併發隊列,因此它可以同時運行該塊的不同調用,從而在多核機器上提供(可能的)性能優勢。與大多數編程問題一樣,還有很多其他方法可以解決這個問題。這只是我想到的一個。

+0

我在想如何做,如果我有x個數組彙總在一起說數組數組,其中x數組可以根據用戶輸入更改。有什麼想法嗎? – 2012-01-27 15:41:30

+0

相同的基本方法應該工作。在枚舉塊內部,不是簡單地將array1中的值與array2中相應的值相加,而是循環遍歷頂級父數組中的所有數組,從每個數組中獲取當前索引的值,然後將所有數組把它們放到結果數組中。如果您需要查看代碼,請告訴我。 – 2012-01-27 16:24:44

+0

如果你不介意爲此提供代碼,我會非常感激。我只是在學習如何編程,對我而言一切都是新的。謝謝 – 2012-01-27 16:27:32

0

如果你想總結一下,你真的無法繞過這兩個陣列至少一次。但是,您可以將該陣列視爲矩陣。在這種情況下,您可以使用一些非常快速的矩陣算術算法或庫。