我正在尝试获取数组中对象的位置,如果对象不存在,我想插入它。奇怪的是,最后一个“复制”字符串正在返回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 ?????
答案 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。