web-dev-qa-db-ja.com

Javaの配列の最初の20要素をループします

ここにこのループがあります

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

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

配列全体をループし、最小値と最大値を見つけます。最初の20個の要素のみをループしたいとしますが、どうすればよいですか?私はこのforループの下にネストされたループを挿入し、それに遭遇するかどうかを確認しましたが、それができませんでした。

7
user1816464

ループ制御条件に要件を追加するだけです。

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

これにより、配列内で20を超える最初の20要素がチェックされますが、20項目未満の場合は配列全体がチェックされます。

22
Andrew Cooper

5つの答えとそれらはすべてループで二重比較がありますか?

Javaプログラムの実行が非常に遅い...

このようなループを行う正しい方法は次のとおりです。

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

長さと20の比較をループの外に移動し、ループ条件を2倍の速さで評価します。 (JITが行っていること、行っていないことを無視)

また、最初の要素で最大/最小を初期化する必要があります(または、elseが原因で配列に要素が1つしかない場合は、無効な値を取得します)。次に、ループの最初の要素をスキップして、 "もっと早く":

 largest = prices[0];
 smallest = prices[0];
 for(int i = 1, len = Math.min(prices.length, 20); i < len; i++)
6
BeniBela
for(int i =0; i < 20 && i < prices.length; i++)

これは20回ループします。つまり、配列の最初の20要素です。

6
user2033853

_prices.length_をMath.min(20, prices.length)に置き換えます。これは、配列の長さまたは20のうち、短い方です。

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

5
amphibient

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];
    }
}
4
partlov

最初の20要素のみをループする場合は、forループのヘッダーで次のように言います。

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