我有一个NSNutable的NSMutable数组,它是从NSInteger值转换而来的。在我有负数和正数混合的情况下,我最终得出的结果是,即使存在负数,最小正数也是最小数。如果所有数字都是负数,它将找到最小的数字(例如-2,-1,-1将给出-2作为最小值)。
self.scoreArray = [[NSMutableArray alloc]initWithObjects:self.pOne, self.pTwo...etc];
NSNumber *min = self.scoreArray[0];
for (int i=0; i<[self.scoreArray count]; i++) {
if (self.scoreArray[i] < min) {
min = self.scoreArray[i];
}
NSLog(@"The smallest number is %@", min);
}
如何更改此值以使最小数字(包括负数)始终正确?
答案 0 :(得分:1)
在您的代码中min
不是int
,它是指向NSNumber
实例的指针。
您必须比较integerValues
。请注意,下面的代码会返回原始NSNumber
,而不是副本。
我也是假设scoreArray
包含NSNumber
s。
self.scoreArray = [[NSMutableArray alloc]initWithObjects:self.pOne, self.pTwo...etc];
NSNumber *min = self.scoreArray[0];
for (int i=0; i<[self.scoreArray count]; i++) {
if ([self.scoreArray[i] integerValue] < [min integerValue]) {
min = self.scoreArray[i];
}
NSLog(@"The smallest number is %@", min);
}
答案 1 :(得分:1)
您正在使用c-type操作来比较对象。这将导致指针地址的比较。如Jean所示,也没有必要从对象创建c类型值,您只需使用compare:
方法即可。三种不同的方法:
您可以对数组进行排序,只需获取第一个元素即可获得更简单的代码
NSArray *sortedNumbers = [self.scoreArray sortedArrayUsingComparator:^NSComparisonResult(NSNumber *n1, NSNumber *n2) {
return [n1 compare:n2];
}];
NSNumber *min = sortedNumbers[0];
或您的方法可以简化
self.scoreArray = @[self.pOne, self.pTwo...etc];
__block NSNumber *min = @(NSIntegerMax);
[self.scoreArray enumerateObjectsUsingBlock:^(NSNumber *n, NSUInteger idx, BOOL *stop) {
if ([n compare:min] == NSOrderedAscending) {
min = n;
}
}];
如果您不喜欢基于块的枚举,则应使用快速枚举
self.scoreArray = @[self.pOne, self.pTwo...etc];
NSNumber *min = @(NSIntegerMax);
for (NSNumber *n in self.scoreArray) {
if ([n compare:min] == NSOrderedAscending) {
min = n;
}
}
答案 2 :(得分:1)
您可以使用KVC检索最小值 -
NSNumber *min = [self.scoreArray valueForKeyPath:@"@min.intValue"];