3

次の2つの配列があります。

 NSArray *array1=[[NSArray alloc]initWithObjects:@"ABC",@"DEF", nil];
 NSArray *array2=[[NSArray alloc]initWithObjects:@"ABC",@"123",@"DEF",@"DEF", nil];

ここで、各 array1 のオブジェクトと array2 を検索し、一致するインデックスを取得する必要があります。私のアプリケーションには、array2 に 1,000 個を超えるオブジェクトが含まれています。

最初の for ループに 2 番目の for ループを配置する以外の最善の方法を提案してください

for (int i=0; i<array1.count; i++)
{
//Need to search the [array1 objectAtIndex:i] string in array2 and need to get the matched indexes into an array in best optimised way here.

    NSMutableArray *matchedIndexesArray=[[NSMutableArray alloc]init];
    NSString *stringToSearch=[array1 objectAtIndex:i];

    //here i can put another array like below to get the matched indexes..but is there any optimized way other than this for loop here? or is there any simple inbuilt method to get the matched objects into an array here.
    for (int j=0; j<array2.count; j++)
    {
        if ([stringToSearch isEqualToString:[array2 objectAtIndex:j]])
        {
            [matchedIndexesArray addObject:[NSString stringWithFormat:@"%d",j]];
        }
    }

    NSLog(@"matchedIndexesArray-->%@<--",matchedIndexesArray);
    //I will use this matchedIndexesArray here further processing...
    //
    //
    //
    //Large Code Here
    //
    //
    //

}
4

3 に答える 3

11

NSSet のドキュメントによると、メンバーシップ テストは配列よりもセットの方が高速です。したがって、最初にセットに変換するのが理にかなっています。array1

NSSet *set1 = [NSSet setWithArray:array1];

array2次に、セット内のメンバーシップについて各オブジェクトをテストします。これは次のように便利に行うことができます

NSIndexSet *matchingIndexes = [array2 indexesOfObjectsPassingTest:^BOOL(NSString *obj, NSUInteger idx, BOOL *stop) {
    return [set1 containsObject:obj];
}];

一致するすべてのインデックスを表示:

[matchingIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
    NSLog(@"%ld", (long)idx);
}];
// Output: 0, 2, 3

更新:NSArray (質問の編集後) いいえ、一致するオブジェクトのインデックスで満たす方法はありません。しかし、を埋める方法がありNSIndexSetます。NSIndexSet配列などの他のデータ構造にインデックスを格納するための特別なコレクションです。次に、コードは次のようになります

for (NSString *stringToSearch in array1) {
    NSIndexSet *matchingIndexes = [array2 indexesOfObjectsPassingTest:^BOOL(NSString *obj, NSUInteger idx, BOOL *stop) {
        return [stringToSearch isEqualToString:obj];
    }];

    NSLog(@"matchingIndexes: %@", matchingIndexes);

    // Work with matchingIndex, for example enumerate all indices:
    [matchingIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
        NSLog(@"%ld", (long)idx);
    }];
}

しかし、それがパフォーマンスに大きな違いをもたらすかどうかはわかりません。

于 2013-11-07T12:51:34.393 に答える
0
NSArray *array1=[[NSArray alloc]initWithObjects:@"ABC",@"DEF", nil];
    NSArray *array2=[[NSArray alloc]initWithObjects:@"ABC",@"123",@"DEF",@"DEF", nil];


    for (int i=0; i<array1.count; i++){
        for (int j=0; j<array2.count; j++) {
            if ([[array1 objectAtIndex:i] isEqualToString: [array2 objectAtIndex:j]]) {
                NSLog(@"Matched Indexes %d %@", i, [array1 objectAtIndex:i] );
            }
        }
       }
于 2013-11-07T12:43:09.890 に答える