Objective c 使用比较器的索引的奇怪行为

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

我试图得到数组中某个对象的位置,如果该对象不在数组中,我想插入它。奇怪的是,最后一个“Copy”字符串返回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 ?????

您误用了方法
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]
,因此使用比较器毫无意义。