7

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

 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ループの下にネストされたループを配置し、それに遭遇するかどうかを確認するという方針に沿って試しましたが、できません。

4

7 に答える 7

22

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

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

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

于 2013-02-04T22:11:10.027 に答える
6

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++)
于 2013-02-04T23:39:32.837 に答える
6
for(int i =0; i < 20 && i < prices.length; i++)

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

于 2013-02-04T22:12:10.643 に答える
5

配列の長さである、または20のいずれか小さい方にprices.length置き換えます。Math.min(20, prices.length)

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 に答える