【问题标题】:Finding the lowest NSInteger from NSArray从 NSArray 中找到最低的 NSInteger
【发布时间】:2015-09-02 17:49:25
【问题描述】:

我正在尝试返回数组中的最小数字。

参数:arrayOfNumbers - NSNumbers 数组。

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

到目前为止,我的代码没有给我任何错误,但没有通过单元测试。我做错了什么?

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

    NSNumber* smallest = [arrayOfNumbers valueForKeyPath:@"@min.self"];
    for (NSInteger i = 0; i < arrayOfNumbers.count; i++) {
        if (arrayOfNumbers[i] < smallest) {
            smallest = arrayOfNumbers[i];
        }
    }

    NSInteger smallestValue = [smallest integerValue];
    return smallestValue;

}

这是单元测试:

- (void) testThatLowestNumberIsReturned {
    NSInteger lowestNumber = [self.handler lowestNumberInArray:@[@3, @8, @-4, @0]];
    XCTAssertEqual(lowestNumber, -4, @"Lowest number should be -4.");

    lowestNumber = [self.handler lowestNumberInArray:@[@83, @124, @422, @953, @1004, @9532, @-1000]];
    XCTAssertEqual(lowestNumber, -1000, @"Lowest number should be -1000.");    
}

【问题讨论】:

  • 您正在将对象与 c 类型进行比较,结果将 im 指针地址与 int 进行比较。
  • 你为什么有那个 for 循环呢?你已经在第一行得到了最小值。
  • @vikingosegundo 明白了!谢谢!我一直在追逐自己的尾巴。哈哈

标签: ios objective-c arrays nsnumber nsinteger


【解决方案1】:

这个方法

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

将已经确定数组中的最小数字,因此方法内的循环是多余的(除了明显错误之外,正如@vikingosegundo 所指出的那样)。

【讨论】:

  • 知道了,谢谢!我一直在追逐自己的尾巴。
【解决方案2】:

您正在将对象与 c 类型进行比较,结果将 im 指针地址与 int 进行比较。

除了你最小的已经是最小的,因为你使用了KVC collection operator@min.self(见Glorfindel的回答),下面的代码显示你正确的比较

if (arrayOfNumbers[i] < smallest)

应该是

if ([arrayOfNumbers[i] compare:smallest] == NSOrderingAscending)

if ([arrayOfNumbers[i] integerValue] < [smallest integerValue])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    相关资源
    最近更新 更多