Objective c 目标C在比较int和id时不进行评估

Objective c 目标C在比较int和id时不进行评估,objective-c,Objective C,我试图在Objective C中实现二进制搜索。我主要在这行代码if([searchItem isEqual:midElement]){,因为当值不同时,它的计算结果是真的searchItem=1和midElement=4: @implementation NSArray (BinarySearch) - (NSInteger) binarySearch : (id) searchItem { NSLog(@"SearchItem: %@", searchItem); retu

我试图在Objective C中实现二进制搜索。我主要在这行代码
if([searchItem isEqual:midElement]){
,因为当值不同时,它的计算结果是真的
searchItem=1
midElement=4

@implementation NSArray (BinarySearch)

- (NSInteger) binarySearch : (id) searchItem {
    NSLog(@"SearchItem: %@", searchItem);
    return [self binarySearch:searchItem min:0 max:[self count] - 1];
}

- (NSInteger) binarySearch:(id)searchItem min:(NSInteger)min max:(NSInteger)max {
    if (max < min) {
        return NSNotFound;
    }

    NSInteger mid = (max + min) / 2;
    id midElement = [self objectAtIndex:mid];
    NSLog(@"Search Item: %d, Current Value: %@, Min: %d, Mid: %d, Max: %d", searchItem, midElement, min, mid ,max);

    NSLog(@"IsEqual: %d", [searchItem isEqual:midElement]);


    if ([searchItem isEqual:midElement]){
        return mid;
    }
    else if (searchItem < midElement){
        return [self binarySearch:searchItem min:min max:mid];
    }
    else{
        return [self binarySearch:searchItem min:mid max:max];
    }
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *orderedList = @[@1, @2, @4, @7, @8, @10];
        NSLog(@"Binary search on a list: %d", [orderedList binarySearch: 1]);
    }
    return 0;
}
编辑基因代码,当我将其更改为:

NSInteger mid = (max + min) / 2;
int midElement = [self objectAtIndex:mid];
NSLog(@"Search Item: %d, Current Value: %@, Min: %d, Mid: %d, Max: %d", searchItem, midElement, min, mid ,max);

NSLog(@"IsEqual: %d", searchItem == midElement);


if (searchItem == midElement){
    return mid;
}
searchItem==midElement
无论发生什么情况,计算结果都为零。代码输出:

SearchItem:
Search Item: 1, Current Value: 4, Min: 0, Mid: 2, Max: 5
IsEqual: 0
Search Item: 1, Current Value: 2, Min: 0, Mid: 1, Max: 2
IsEqual: 0
Search Item: 1, Current Value: 1, Min: 0, Mid: 0, Max: 1
IsEqual: 0
Binary search on a list: -1

isEqual:是如何实现的,而且你的<运算符不可能给出你想要的,你正在尝试与对象进行比较,objective-c不支持运算符重载,如果你想实现自己的二进制搜索,请看看实现一个compare:方法,该方法可以返回一个值,告诉你两个对象应该如何排序,这样,您只有一个方法调用,而不是两个更有效的方法调用。更好的是,NSArray有一个名为IndexOfoObject:InsertedRange:options:usingComparator:,它可以传递一个选项来为您执行二进制搜索。

isEqual:是如何实现的,而且您的<运算符可能不会给您想要的,您是tr要与对象进行比较,objective-c不支持运算符重载,如果您想实现自己的二进制搜索,请考虑实现一个compare:方法,该方法可以返回一个值,告诉您两个对象应如何排序,这样您只有一个方法调用,而不是两个方法调用,这更有效。更好的是,NSArray有一个hod称为IndexOfoObject:inSortedRange:options:usingComparator:,它可以为您传递一个进行二进制搜索的选项。

您正在将一个标量整数
1
传递给
-binarySearch:
,后者将其视为对象指针
id
。您需要传递
@1
或另一个
NSNumber*
(至少一个对象指针)

另外,由于
searchItem
是一个对象指针,您应该使用
%@
而不是
%d
(正如警告试图告诉您的那样)来记录它。
%d
没有崩溃的唯一原因是因为另一个bug。这两个bug相互抵消了


您应该不要使用
将标量整数
1
传递给
-binarySearch:
,它将其视为对象指针
id
。您需要传递
@1
或另一个
NSNumber*
(至少是一个对象指针)

另外,由于
searchItem
是一个对象指针,您应该使用
%@
而不是
%d
(正如警告试图告诉您的那样)来记录它。
%d
没有崩溃的唯一原因是因为另一个bug。这两个bug相互抵消了


你不应该使用
你的问题源于Objective-C中的
@1
实际上是什么。它不是
NSInteger
。它是
[NSNumber numberwhithint:1]
的字面缩写。也就是说,它创建了一个对象

然后,您试图将NSInteger与对象引用进行比较,但并不奇怪,它不起作用

事实上,这一行:

NSLog(@"Binary search on a list: %d", [orderedList binarySearch: 1]);
应向您提供一个错误和警告,指出问题:

ARC下不允许将“int”隐式转换为“id” 不兼容的整数到指针转换将“int”发送到“id”类型的参数

通过识别您实际上正在处理对象并使用
compare
方法,您可以得到:

@implementation NSArray (BinarySearch)

- (NSInteger) binarySearch : (id) searchItem {
    NSLog(@"SearchItem: %@", searchItem);
    return [self binarySearch:searchItem min:0 max:[self count] - 1];
}

- (NSInteger) binarySearch:(id)searchItem min:(NSInteger)min max:(NSInteger)max {


    if (max-min < 2) {
        return NSNotFound;
    }

    NSInteger mid = (max + min) / 2;

    NSNumber *midElement = [self objectAtIndex:mid];
    NSLog(@"Search Item: %@, Current Value: %@, Min: %ld, Mid: %ld, Max: %ld", searchItem, midElement, min, mid ,max);

    NSComparisonResult result = [midElement compare:searchItem];

    switch (result) {
        case NSOrderedSame:
            return mid;
            break;

        case NSOrderedAscending:
            return [self binarySearch:searchItem min:mid max:max];
            break;

        case NSOrderedDescending:
            return [self binarySearch:searchItem min:min max:mid];
            break;
    }

}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *orderedList = @[@1, @2, @4, @7, @8, @10];
            NSLog(@"Binary search on a list: %ld", [orderedList binarySearch: @7]);
    }
    return 0;
}
@实现NSArray(二进制搜索)
-(NSInteger)二进制搜索:(id)搜索项{
NSLog(@“SearchItem:%@”,SearchItem);
返回[self binarySearch:searchItem最小值:0最大值:[自计数]-1];
}
-(NSInteger)二进制搜索:(id)搜索项最小值:(NSInteger)最小值最大值:(NSInteger)最大值{
如果(最大最小值<2){
返回NSNotFound;
}
NSInteger mid=(最大+最小)/2;
NSNumber*midElement=[self-objectAtIndex:mid];
NSLog(@“搜索项:%@,当前值:%@,最小值:%ld,中间值:%ld,最大值:%ld”,搜索项,中间元素,最小值,中间值,最大值);
NSComparisonResult=[midElement比较:searchItem];
开关(结果){
案例名称:
中途返回;
打破
案件撤销:
返回[自二进制搜索:搜索项最小值:中最大值:最大值];
打破
案件撤销:
返回[self-binarySearch:searchItem-min:min-max:mid];
打破
}
}
@结束
int main(int argc,const char*argv[]{
@自动释放池{
NSArray*orderedList=@[@1,2,4,7,8,10];
NSLog(@“列表上的二进制搜索:%ld”,[orderedList binarySearch:@7]);
}
返回0;
}
这给出了输出

搜索项目:7

搜索项:7,当前值:4,最小值:0,中间值:2,最大值:5

搜索项:7,当前值:7,最小值:2,中间值:3,最大值:5

列表上的二进制搜索:3

程序以退出代码结束:0


您的终止条件也有问题,如果找不到项,将导致无限递归。

您的问题源于Objective-C中的
@1
实际上是什么。它不是
NSInteger
。它是
[NSNumber numberwhithint:1]
的字面缩写。即,它创建了一个对象

然后,您试图将NSInteger与对象引用进行比较,但并不奇怪,它不起作用

事实上,这一行:

NSLog(@"Binary search on a list: %d", [orderedList binarySearch: 1]);
应向您提供一个错误和警告,指出问题:

ARC下不允许将“int”隐式转换为“id” 不兼容的整数到指针转换将“int”发送到“id”类型的参数

通过识别您实际上正在处理对象并使用
compare
方法,您可以得到:

@implementation NSArray (BinarySearch)

- (NSInteger) binarySearch : (id) searchItem {
    NSLog(@"SearchItem: %@", searchItem);
    return [self binarySearch:searchItem min:0 max:[self count] - 1];
}

- (NSInteger) binarySearch:(id)searchItem min:(NSInteger)min max:(NSInteger)max {


    if (max-min < 2) {
        return NSNotFound;
    }

    NSInteger mid = (max + min) / 2;

    NSNumber *midElement = [self objectAtIndex:mid];
    NSLog(@"Search Item: %@, Current Value: %@, Min: %ld, Mid: %ld, Max: %ld", searchItem, midElement, min, mid ,max);

    NSComparisonResult result = [midElement compare:searchItem];

    switch (result) {
        case NSOrderedSame:
            return mid;
            break;

        case NSOrderedAscending:
            return [self binarySearch:searchItem min:mid max:max];
            break;

        case NSOrderedDescending:
            return [self binarySearch:searchItem min:min max:mid];
            break;
    }

}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *orderedList = @[@1, @2, @4, @7, @8, @10];
            NSLog(@"Binary search on a list: %ld", [orderedList binarySearch: @7]);
    }
    return 0;
}
@实现NSArray(二进制搜索)
-(NSInteger)二进制搜索:(id)搜索项{
NSLog(@“SearchItem:%@”,SearchItem);
返回[self binarySearch:searchItem最小值:0]