Objective c 使用比较器的索引的奇怪行为
我试图得到数组中某个对象的位置,如果该对象不在数组中,我想插入它。奇怪的是,最后一个“Copy”字符串返回NSNotFound,我无法想象为什么Objective c 使用比较器的索引的奇怪行为,objective-c,nsmutablearray,comparator,indexof,Objective C,Nsmutablearray,Comparator,Indexof,我试图得到数组中某个对象的位置,如果该对象不在数组中,我想插入它。奇怪的是,最后一个“Copy”字符串返回NSNotFound,我无法想象为什么 NSMutableArray *original = [[NSMutableArray alloc] init]; NSMutableArray *new = [[NSMutableArray alloc] init]; [original addObject:@"Copy"]; [original addObject:@"Copy"]; [origi
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 ?????
您误用了方法
indexOfObject:insertedrange:
。该方法应仅用于预排序的数组,您正在检查的数组未排序。您的数组没有排序,因为“Camper”将位于该数组中所有其他对象的前面。当您给它一个未排序的数组时,indexOfObject:insertedrange:
具有未定义的行为
这是做你想做的事的正确方法。如果您想使用不同的选项或方法来确定相等性,则可以使用其他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);
}
有关更多信息,请参阅。这很有道理,谢谢!但是,如果我需要使用比较器呢?就像比较一个对象的属性以知道它们是否相同。只需编辑以使用自定义相等检查显示。比较器仅用于排序(您没有这样做),但返回布尔值表示相等的块可以实现您想要的。比较器最无用的用法,如
indexOfObject:
将调用[obj1 compare:obj2]
。但是,这是怎么回事…@vikingosegundo实际上我需要这个来比较真实的对象,我在问题中使用了一个NSString,以便于理解。这就是为什么我说我需要使用比较器!只需更改return[string compare:obj]==sensorderedname代码>部分到您想要的任何比较,比如返回[someArray isEqualToArray:obj]
indexOfObject:
将执行[obj1比较:obj2]
,因此使用比较器毫无意义。