indexOf usingComparator的奇怪行为

时间:2014-04-28 00:25:56

标签: objective-c nsmutablearray comparator indexof

我正在尝试获取数组中对象的位置,如果对象不存在,我想插入它。奇怪的是,最后一个“复制”字符串正在返回NSNotFound,我无法想象为什么。

NSMutableArray *original = [[NSMutableArray alloc] init];
NSMutableArray *new = [[NSMutableArray alloc] init];
[original addObject:@"Copy"];
[original addObject:@"Copy"];
[original addObject:@"Table"];
[original addObject:@"Table"];
[original addObject:@"Camper"];
[original addObject:@"Copy"];

for (NSString *string in original) {
    NSUInteger i = [new indexOfObject:string inSortedRange:NSMakeRange(0, [new count]) options:NSBinarySearchingFirstEqual usingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [obj1 compare:obj2];
    }];

    if (i == NSNotFound) {
        [new addObject:string];
    }

    NSLog(@"%lu", (unsigned long)i);
}

我知道我可以通过其他方式做到这一点,但我只是想了解这是错误的。这是NSLog:

2147483647 (NSNotFound)
0
2147483647 (NSNotFound)
1
2147483647 (NSNotFound)
2147483647 (NSNotFound) WHY ?????

1 个答案:

答案 0 :(得分:0)

您滥用方法indexOfObject:inSortedRange:。该方法只应用于预先排序的数组,您正在检查的数组未排序。您的数组未排序,因为“Camper”将出现在该数组中的所有其他对象之前。当你给它一个未排序的数组时,indexOfObject:inSortedRange:有未定义的行为。

这是做你想要的正确方法。如果您想要使用不同的选项或方法来确定相等性,还有其他NSArray方法可用于查找索引。

NSMutableArray *original = [[NSMutableArray alloc] init];
NSMutableArray *new = [[NSMutableArray alloc] init];
[original addObject:@"Copy"];
[original addObject:@"Copy"];
[original addObject:@"Table"];
[original addObject:@"Table"];
[original addObject:@"Camper"];
[original addObject:@"Copy"];

for (NSString *string in original) {
    NSUInteger i = [new indexOfObjectWithOptions:0 passingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        return [string compare:obj] == NSOrderedSame;
    }];

    if (i == NSNotFound) {
        [new addObject:string];
    }

    NSLog(@"%lu", (unsigned long)i);
}

有关详细信息,请参阅NSArray documentation