在数组中找到最小数字时不考虑负数

时间:2014-09-01 23:11:08

标签: ios objective-c algorithm

我有一个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);
}

如何更改此值以使最小数字(包括负数)始终正确?

3 个答案:

答案 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"];