2016-01-05 3 views
2

Im работает над назначением, в котором я должен найти максимальное значение в массиве, используя цикл for, и не сортируя его. Я чувствую, что до сих пор я близок к правильности, но не совсем там. Ниже приведен пример кода, который у меня есть.Objective-C: Как найти максимальное значение в массиве без сортировки?

NSArray *unsortedArray = @[ @2, @44, @11, @99, @35 ]; 


for (int i = 0; i < 4 ; i++) { 
    id number = [unsortedArray objectAtIndex:i]; 
    id largestNumber = 0; 
    if (largestNumber < number) { 
     largestNumber = number; 


     NSLog(@"%@ is the largest number", largestNumber); 

    return 0; 
    } 

} 

Теперь это возвращает только первое значение в этой области, то цикл останавливается, я назначая неправильные значения в largestNumber и номер? Очень новичок в коде, поэтому я был бы признателен за отзывы и примеры.

Спасибо!

+1

Почему у вас есть обратная связь 0? – CStreel

ответ

13

Key-Value-Coding решение, без петли

NSArray *unsortedArray = @[ @2, @44, @11, @99, @35 ]; 
NSNumber *maxNumber = [unsortedArray valueForKeyPath:@"@max.self"]; 
NSLog(@"%@", maxNumber); // 99 

См. Эту интересную статью Мэтта Томпсона: KVC Collection Operators

+0

Ницца, узнал что-то новое! –

+1

Про двигаться. в документах он вызывает 'compare:' под капотом – Nick

-2

У вас слишком много внутри цикла for.

Вам нужно поместить объявление наибольшего числа за пределы цикла for. Также вам может не хватать }, так как «return 0» в инструкции if немедленно выйдет из всей функции, и поскольку ее внутри цикла for он выходит на первый проход.

id largestNumber = 0; 

for (int i = 0; i < 4 ; i++) { 
    id number = [unsortedArray objectAtIndex:i]; 

    if (largestNumber < number) { 
     largestNumber = number; 
    } 
} 

NSLog(@"%@ is the largest number", largestNumber); 
return 0; // Not sure if you even need this 
+0

Не работает, если массив имеет отрицательное число. – Avt

+0

Хорошая точка!Я старался держать его как можно ближе к оригиналу. Вероятно, ваш лучший ответ, например, «Самый большой» выход, чтобы помочь выяснить, что происходит. –

+0

Спасибо за ответ! Он работал после применения ваших изменений, не могли бы вы объяснить, почему mostNumber должен быть вне цикла for? – adeslauriers89

-1

Я игнорирую обратную связь 0, так как я не уверен в вашей цели. Но вам нужно объявить идентификатор largestNumber вне цикла, чтобы отслеживать его

NSArray *unsortedArray = @[ @2, @44, @11, @99, @35 ]; 

NSNumber *largestNumber = @0; 
for (int i = 0; i < [unsortedArray count] ; i++) { 
    NSNumber *number = [unsortedArray objectAtIndex:i]; 
    if ([number isGreaterThan:largestNumber]) { 
     largestNumber = number; 
    } 
} 
NSLog(@"%@ is the largest number", largestNumber); 

Это будет отслеживать изменения в массив largestNumber, а затем войти результат после того, как он закончил итерации.

Существует и другой подход, который использует Еогеасп подход

NSLog(@"%@ is the largest number", largestNumber); 
NSNumber *largestNumber = @0; 
for (NSNumber *number in unsortedarray) { 
    if ([number isGreaterThan:largestNumber]) { 
     largestNumber = number; 
    } 
} 
NSLog(@"%@ is the largest number", largestNumber); 

Если вы хотите мне объяснить Еогеасп, просто комментарий

+0

Спасибо за ответ! Я заметил изменение, которое вы сделали в цикле for, где «i <4» теперь «i <[unsortedArray count]». Это делает его гибким для любого размера массива, где предыдущий работает только с массивами, содержащими 5 объектов? – adeslauriers89

+1

Вы не можете использовать '' 'на объектах NSNumber'. – rmaddy

+0

@rmaddy это правда, но я использую его там, чтобы просто передать сравнение. Его можно просто получить и сравнить с intValue или IntegerValue, поэтому я не думал включать его. – CStreel

0

КВЦ ответ лучше, но если вы хотите сделать это с петлей ..

NSArray *unsortedArray = @[ @2, @44, @11, @99, @35 ]; 

NSNumber *l = [unsortedArray objectAtIndex:0]; 
for (int i = 1; i < 5; i++) { 
    l = ([[unsortedArray objectAtIndex:i]integerValue] > [l integerValue] ? [unsortedArray objectAtIndex:i]:l); 
} 
NSLog(@"Largest = %@\n",l); 

Кроме того, учитывая, у вас есть пять объектов в массиве, ваш инвариант цикла должен проверить i < 5, неi < 4. Это остановится на индексе 3, когда вы должны остановиться после индекса 4. Наконец, это сравнивает целочисленные значения только в том виде, в каком оно стоит, если вы хотите сравнить числа с плавающей точкой или другие числовые типы. Не забудьте указать соответствующее свойство. Вы можете увидеть их все here.

Edit: (Downvotes за то, что этот ответ это правильно ..?)

Для уточнения, так как вы новичок, if заявление также может быть записана следующим образом: a = (b > c ? (return this if true):(return this if false)

Смежные вопросы