Objective c 目标C在比较int和id时不进行评估
我试图在Objective C中实现二进制搜索。我主要在这行代码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
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]