【问题标题】:Return the lowest number in an array返回数组中的最小数字
【发布时间】:2015-09-02 03:31:14
【问题描述】:

在不知道范围和何时数组无序的情况下,不需要对数组进行升序排序,得到第一个元素

所以我有这个方法:

- (NSInteger) lowestNumberInArray:(NSArray *)arrayOfNumbers {

参数:NSNumbers数组

返回:数组中最小的数作为一个NSInteger

我正在考虑一个循环遍历数组的 for 循环,一旦找到最小的数字,然后将该数字存储到 NSInteger 中。但是,我不知道数组值的范围,也就是我不知道我的最大和最小数字是多少。我查看了 NSArray 和 NSMutableArray 文档,没有找到任何可以用来返回最小值的方法。对你的帮助表示感谢! :)

- (NSInteger) lowestNumberInArray:(NSArray *)arrayOfNumbers {

    smallest = equalBiggestNumber;
    for (NSInteger i = 0; i < arrayOfNumbers.count; i++) {
        if (arrayOfNumbers[i] < smallest) {
            smallest = arrayOfNumbers[i];
        }

    return 0;
}

【问题讨论】:

  • 根据您问题中的代码,最小的数字始终为 0 ;P
  • 你的数组中可以有负数吗?
  • @cream-corn 是的,他们可以有负数。
  • 这段代码,如果是你实际使用的,将不会编译。 smallest 未声明为任何类型。 NSNumber *smallestNSInteger smallest,您的循环缺少右括号。仅供参考return 0。所以无论你的循环实际上是什么。它将返回 0
  • @KerolosNakhla 考虑接受有用的答案。要接受答案,请单击最佳答案旁边的空心复选标记,这样做会提高您的声誉并提供更多功能,请参阅reputation faq 更多详细信息,请参阅this page。另外请考虑返回并接受过去的答案,这样做会增加您的声誉并允许更多功能,请参阅reputation faq

标签: ios objective-c arrays


【解决方案1】:

您可以为此使用 KVC 和 collection operators

NSNumber* smallest = [arrayOfNumbers valueForKeyPath:@"@min.self"];

如果数组元素是对象并且您想要最小的属性值,您将使用该属性的键而不是键路径中的“self”。碰巧,self 是所有对象的“属性”,NSNumbers 可以直接比较,因此您可以在那里使用“self”。

【讨论】:

    【解决方案2】:

    你不需要。 smallest 的初始值可以是任意数量的 numberArray。你可以:

    smallest = arrayOfNumbers[0];
    

    或者如果你真的想要:

    smallest = NSIntegerMax;
    

    然后执行for 循环。如果将 minimum 分配给数组中的第一个对象,则可以在循环中跳过它。

    NSInteger smallest = arrayOfNumbers[0];
    for (NSInteger i = 1; i < arrayOfNumbers.count; i++) {
    
        if (arrayOfNumbers[i] < smallest) {
            smallest = arrayOfNumbers[i];
        }
    }
    
    return smallest;
    

    }

    【讨论】:

    • @Rajatp 已编辑。你误会了。
    • 为了澄清(对于 Rajatp 和其他人),SugaR 建议您在循环之前执行smallest = arrayOfNumbers[0]。仍然需要循环来查找数组的任何其他元素是否更小,尽管可以将其调整为从索引 1 开始,因为索引 0 已经被检查过。
    • @KenThomases 没错。谢谢你。抱歉不清楚。
    • @SugaR 所以我做了最小的 = arrayOfNumbers[0];但随后收到一条错误消息,指出最小(在循环内)是一个未声明的标识符。你有什么想法?
    【解决方案3】:

    你可以试试这个

    int max = [[numbers valueForKeyPath:@"@max.intValue"] intValue];
    

    NSNumber * max = [numbers valueForKeyPath:@"@max.intValue"];
    with numbers as an NSArray
    

    版本1:对数组进行排序:

    NSArray *sorted1 = [numbers sortedArrayUsingSelector:@selector(compare:)];
    // 1.585 seconds
    

    版本2:键值编码,使用“doubleValue”:

    NSNumber *max=[numbers valueForKeyPath:@"@max.doubleValue"];
    NSNumber *min=[numbers valueForKeyPath:@"@min.doubleValue"];
    // 0.778 seconds
    

    版本 3:键值编码,使用“self”:

    NSNumber *max=[numbers valueForKeyPath:@"@max.self"];
    NSNumber *min=[numbers valueForKeyPath:@"@min.self"];
    // 0.390 seconds
    

    版本 4:显式循环:

    float xmax = -MAXFLOAT;
    float xmin = MAXFLOAT;
    for (NSNumber *num in numbers) {
        float x = num.floatValue;
        if (x < xmin) xmin = x;
        if (x > xmax) xmax = x;
    }
    // 0.019 seconds
    

    版本 5:块枚举:

    __block float xmax = -MAXFLOAT;
    __block float xmin = MAXFLOAT;
    [numbers enumerateObjectsUsingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) {
        float x = num.floatValue;
        if (x < xmin) xmin = x;
        if (x > xmax) xmax = x;
    }];
    // 0.024 seconds
    

    我从这个链接Finding the smallest and biggest value in NSArray of NSNumbers得到这个答案

    Finding maximum numeric value in NSArray

    【讨论】:

    • prob 应该从您的答案中删除版本 5,因为它在原始答案中被删除为不正确
    • @Fonix 版本 5 未被删除。 concurrent 块枚举的不同版本被删除。
    【解决方案4】:

    您的问题有点令人困惑。你怎么会不知道数组的大小?数组是否继续获取添加的值?

    -- 如果数组始终在随机时间添加值,您应该创建一个通知。然后每当有一个新的号码加入时,比较新加入的号码,看看这是否是你新的最低号码。

    希望对你有帮助!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 2014-09-14
      • 2012-11-13
      • 1970-01-01
      • 2016-03-06
      相关资源
      最近更新 更多