Objective-C:如何在没有排序的情况下找到数组中的最高值?

时间:2016-01-05 22:09:55

标签: objective-c

我正在进行一项任务,我必须使用for循环在数组中找到最高值,而不进行排序。我觉得我到目前为止已接近正确但不完全正确。下面是我到目前为止的代码示例。

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

}

现在这只返回区域中的第一个值然后循环停止,我是否将错误的值分配给maximumNumber和number?代码很新,所以我很感激,反馈和例子。

谢谢!

4 个答案:

答案 0 :(得分:17)

键值编码解决方案,无循环

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

请参阅Mattt Thompson撰写的这篇有趣的文章: class

答案 1 :(得分:0)

我忽略了返回0,因为我不确定你的目的是什么。但是你需要在循环外声明id maximumNumber来跟踪它

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

这将跟踪对maximumNumber数组的更改,然后在迭代完成后记录结果。

还有另一种使用foreach方法的方法

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

如果您希望我解释foreach,请发表评论

答案 2 :(得分:0)

KVC答案是最好的,但如果你想用循环来做..

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。当你应该在索引4之后停止时,它将在索引3处停止。最后,如果要比较浮点或其他数字类型,则仅比较整数值。您应该记得指定适当的属性。你可以看到所有here

修改(Downvotes for what?此答案 正确..)

为了澄清,因为你是新的,if语句也可以写成如下: a = (b > c ? (return this if true):(return this if false)

答案 3 :(得分:-1)

你在for循环中有太多内容。

您需要将forNumber的声明放在for循环之外。你也可能错过了},因为if语句中的“return 0”会立即退出整个函数,因为它在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