2012-01-27 5 views
0

私は2つのNSArrayオブジェクトを持っています。インデックスiの配列1のintが配列2のintにインデックスiで追加され、結果が新しい配列に追加されるように、2つの配列をコンポーネントごとに追加したいとします。 for(int i = 0; i < [array1 count]; i ++)型のメソッドのためのより高速な方法がありますか?たとえば、C列、高速列挙、ブロックを使用できますか?私は、多数のオブジェクトを含むx個の配列を追加したいので特に興味があります。現在のコードは次のとおりです。コンポーネントごとに2つの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()がある。このような何かを呼び出しますグランドセントラルディスパッチ機能は、特定の回数だけコードブロックを実行します。 dispatch_get_global_queue()で取得したグローバルな並行キューを使用するように指示しているので、マルチコアマシンで(可能な)パフォーマンス上の利点を提供しながら、ブロックの異なる呼び出しを同時に実行できます。ほとんどのプログラミング問題と同様に、この問題には他にも多くの方法があります。これは私にとって心に浮かんだものです。

+0

x個の配列が合計で配列の配列から言えばxの配列がユーザー入力に基づいて変更できる場合は、これをどうやって行うのかについてもっと考えていました。何かご意見は? –

+0

同じ基本的なアプローチが有効です。列挙ブロックの内部では、array1の値とarray2の対応する値を単に加算するのではなく、最上位の親配列のすべての配列をループし、各配列の現在のインデックスの値を取得してから、それらをアップして結果配列に入れます。このコードを参照する必要がある場合は、私に教えてください。 –

+0

このコードを提供しても大丈夫なら、本当に感謝します。私はプログラムの仕方を学んでいるだけで、すべては私には新しいものです。 –

0

合計したい場合は、両方の配列を少なくとも1回以上移動する必要はありません。しかし、配列を行列として見ることができます。この文脈では、使用するための非常に高速な行列算術アルゴリズムまたはライブラリがあります。ここで