2015-09-02 3 views
-2

Я пытаюсь вернуть самое низкое число в массиве.Поиск самого низкого NSInteger от NSArray

Параметр: 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.");  
} 
+1

Вы сравниваете объекты с типами c, в результате чего адреса im pointer сравниваются с int. – vikingosegundo

+1

Почему у вас есть это для цикла вообще? Вы уже получаете мин в первой строке. – dan

+0

@vikingosegundo получил! благодаря! Некоторое время я гонялся за своим хвостом. LOL – ioskaveen

ответ

3

Этот метод

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

уже будет определять наименьшее число в массиве, так что цикл внутри метода является излишним (на вершине того, чтобы быть просто неправильно, так как @vikingosegundo уведомлений).

+0

Получил это спасибо! Я некоторое время гонялся за своим хвостом. – ioskaveen

2

вы сравниваете объекты с типами гр, в результате чего им-адреса указателя сравнивается с междунар.

Помимо того, ваш маленький уже самый маленький, как вы использовали KVC collection operator@min.self (см Глорфиндел ответ), следующий код показывает корректное сравнение

if (arrayOfNumbers[i] < smallest) 

должен быть

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

или

if ([arrayOfNumbers[i] integerValue] < [smallest integerValue]) 
Смежные вопросы