【问题标题】:Negative numbers not considered when finding smallest number in an array在数组中查找最小数时不考虑负数
【发布时间】:2014-09-01 23:11:07
【问题描述】:

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

我怎样才能改变它以使最小的数字(包括负数)总是正确的?

【问题讨论】:

  • scoreArray 是否包含 NSNumbers?您需要返回代表最小值的 NSNumber 的实例,还是该实例的副本?
  • 是的,scoreArray 包含 NSNumbers。我想返回 NSNumber 的实例。
  • 那么,试试我的回答。它比较包裹在 NSNumbers 中的 integerValues 并返回包含最小值的 NSNumber 的实例。
  • 您的回答成功了,谢谢。

标签: ios objective-c algorithm


【解决方案1】:

在您的代码中min 不是int,它是指向NSNumber 实例的指针。 你必须比较integerValues。请注意,下面的代码将返回原始的 NSNumber,而不是副本。 我还假设scoreArray 包含NSNumbers。

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);
}

【讨论】:

    【解决方案2】:

    您正在使用 c 类型操作来比较对象。这将导致指针地址的比较。也不需要像 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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      你可以使用 KVC 来检索最小值 -

      NSNumber *min = [self.scoreArray valueForKeyPath:@"@min.intValue"];
      

      【讨论】:

        猜你喜欢
        • 2017-06-02
        • 2019-12-14
        • 2021-11-29
        • 1970-01-01
        • 2019-02-13
        • 2019-09-10
        • 2013-06-27
        • 1970-01-01
        • 2020-05-13
        相关资源
        最近更新 更多