在ios中比较2 nsmutablearray时如何获得相同对象的索引

时间:2013-08-18 09:56:50

标签: ios objective-c cocoa-touch nsmutablearray

我有2个阵列:

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

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

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

你有什么建议吗?

2 个答案:

答案 0 :(得分: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]];
    }
}

答案 1 :(得分:1)

您也可以使用有序集。创建一组所有相交对象,在两个数组中找到的所有对象。迭代此交集,并获取集合中每个对象的array1中的索引。

完整的命令行示例:

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包含相同的对象,则只返回第一个索引。