3

我有以下两个数组。

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

现在我必须在 array2 中搜索每个 array1 的对象,并且需要获取匹配的索引。我的应用程序在array2 中包含一千多个对象。

请建议最好的方法,而不是将第二个 for 循环放在第一个 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 回答
4
NSArray *a = @[@"123", @"456", @"ABC", @"DEF"];
NSArray *b = @[@"123", @"ABC", @"---"];

NSIndexSet *indexes = [a indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop)
{
    return [b containsObject:obj]
}];

NSLog(@"%@", indexes);
于 2013-11-07T12:53:33.647 回答
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 回答