7

I have this loop here

 for(int i =0; i < prices.length; i++)
  {
        if(prices[i]>largest)
        {
            largest = prices[i];
        }

        else if(prices[i]<smallest)
        {
            smallest= prices[i];
        }
  }

which loops through the whole array and finds the min and max value. Say I wanted to only loop through the first 20 elements how do I do that? I have tried along the lines of putting a nested loop in under this for loop and seeing if I come across it but I can't.

4

7 回答 7

22

您可以将要求添加到循环控制条件:

for(int i =0; i < prices.length && i < 20; i++)

这将检查数组中超过 20 个的前 20 个元素,但如果少于 20 个项目,则检查整个数组。

于 2013-02-04T22:11:10.027 回答
6
for(int i =0; i < 20 && i < prices.length; i++)

这将循环 20 次,即数组的前 20 个元素。

于 2013-02-04T22:12:10.643 回答
6

5个答案,他们都在循环中有双重比较?

难怪Java程序运行得这么慢……

执行此类循环的正确方法是:

 for(int i = 0, len = Math.min(prices.length, 20); i < len; i++)

将 length 和 20 之间的比较移出循环并评估循环条件,因此速度提高了一倍。(忽略 JIT 可能会或可能不会做的事情)

此外,您必须使用第一个元素初始化最大/最小元素(或者如果由于 else 而数组中只有一个元素,则会得到无效值),然后您可以跳过循环中的第一个元素,使其均匀“快点”:

 largest = prices[0];
 smallest = prices[0];
 for(int i = 1, len = Math.min(prices.length, 20); i < len; i++)
于 2013-02-04T23:39:32.837 回答
5

替换prices.lengthMath.min(20, prices.length),这是数组的长度或 20,以较小者为准:

for(int i =0; i < Math.min(20, prices.length); i++)

于 2013-02-04T22:21:37.367 回答
4

将您的 for 循环更改为以下内容:

for(int i =0; i < (prices.length < 20 ? prices.length : 20); i++)
{
    if(prices[i]>largest)
    {
        largest = prices[i];
    }
    else if(prices[i]<smallest)
    {
        smallest= prices[i];
    }
}
于 2013-02-04T22:11:35.403 回答
3

如果你只想循环遍历前 20 个元素,那么在 for 循环的标题中这样说,就像这样。

for(int i =0; i < prices.length && i < 20; i++)
于 2013-02-04T22:09:56.983 回答
-1

最大值是正确的以获得最小值很简单让 max = min 然后像那时一样工作

if(min>x[i])
  min=x[i];
于 2016-01-16T22:30:02.197 回答