2015-06-12 3 views
0

Я пробовал следующий метод для поиска объекта с помощью двоичного поиска, но в результате возникает некоторая величина для мусора.indexOfObject: inSortedRange: options: usingComparator возвращает неверный индекс

NSArray *orderedSet = [[NSArray alloc]initWithObjects:@2,@3,@5,nil]; 
    NSLog(@"%@",orderedSet); 

    NSLog(@"%lu",(unsigned long)[orderedSet indexOfObject:@3 inSortedRange:NSMakeRange(0, 3) options:NSBinarySearchingFirstEqual usingComparator:^NSComparisonResult(id obj1, id obj2) { 
     return [obj2 compare:obj1]; 
    }]); 

Он выводит 9223372036854775807, может ли кто-нибудь сообщить мне, что я делаю неправильно здесь.

+1

Обратите внимание, что если вы '[obj1 сравнения: obj2]' вместо '[obj2 сравнения: obj1]' это работает , Может быть, намек на то, почему. – Larme

+0

Это работает, но не получает логики, какие технические изменения она делает. –

+0

Я просто нашел еще один интересный момент: если вы делаете 'NSInteger index = [orderedSet indexOfObject: @ 3 inSortedRange и т. Д.]' С вашим кодом, он равен 'NSNotFound'. Это интересно, потому что возврат должен быть NSUInteger (без отрицательного индекса). Я протестировал на Simulator iPhone 4S (может быть связан с 32-м и 64-мя битами). Теперь, почему он не находит его с вашим «пользовательским сравнением», может быть связано с тем, как он написан. Может быть, вводить в заблуждение, потому что ваш первый First, массив нужно сортировать, а ваш тип и компаратор «возвращены/противны». – Larme

ответ

0

изменение короткопробежные (0,3) до (0,2)

NSLog(@"%lu",(unsigned long)[orderedSet indexOfObject:@3 inSortedRange:NSMakeRange(0, 2) options:NSBinarySearchingFirstEqual usingComparator:^NSComparisonResult(id obj1, id obj2) { 
     return [obj2 compare:obj1]; 
    }]); 
+0

Но почему? (добавив больше текста, чтобы опубликовать комментарий) –

+0

, потому что массив имеет только до индекса 2, нет третьего индекса. как @ [0] = 2, @ [1] = 3 и @ [2] = 5. –

+0

Его длина диапазона, начиная с 0 и пересекая 3 элемента. –