-5

我有 2 个数组:

array1 = "a", "b", "c","d";
array2 = "c", "b";
=> array3 = "2", "1"; // array get index from array1

当array2中的对象等于array1时,我想从array1获取索引。我使用了这段代码,但当 array2 只有 1 个对象时它不正确。

for (id obj in array2) {
   if([array1 containsObject:obj]){
       [array3 addObject:[NSNumber numberWithInteger:[array1 indexOfObject:obj]]];
 }

你有什么建议吗 ?

4

2 回答 2

1

您也可以使用有序集。创建一组所有相交对象,即在两个数组中找到的所有对象。然后遍历该交集并获取数组中存在的每个对象的数组 1 中的索引。

完整的命令行示例:

int main(int argc, const char * argv[])
{

    @autoreleasepool {


        NSArray *array1 = @[@"a", @"b", @"c",@"d"];
        NSArray *array2 = @[@"c",@"b"];
        NSMutableArray *array3 = [@[] mutableCopy];

        NSMutableOrderedSet *intersectSet = [NSMutableOrderedSet orderedSetWithArray:array2];
        [intersectSet intersectSet:[NSSet setWithArray:array1]];

        for (id obj in intersectSet) {
            [array3 addObject:@([array1 indexOfObject:obj])];
        }
        // array3 contains (2, 1)
    }
    return 0;
}

请注意,如果 array1 包含相同的对象,则只会返回第一个索引。

于 2013-08-18T13:49:54.727 回答
1

一旦您修复了一些明显的错误,您的代码片段应该可以工作。array1您可以通过执行一次搜索而不是两次来加速它:

for (id obj in array2) {
    // containsObject is a linear search; combine it with indexOfObject
    // for better performance:
    NSUInteger pos = [array1 indexOfObject:obj];
    if (pos != NSNotFound) {
        [array3 addObject:[NSNumber numberWithInteger:pos]];
    }
}
于 2013-08-18T10:04:33.490 回答