1

株式の売買で得られる利益を最大化するプログラムを作成しようとしています。次のインデックスの値が現在のインデックス位置の値より大きいかどうかを確認しようとしていますが、ループによって配列が範囲外になります。この行で発生します if((shares[i]) < (shares[i+1]).)これを防ぐ最善の方法は何ですか。

編集:株価のリストが渡されました。毎日、私は買うか売ることができます。私のアプローチは、株価の平均を見つけることです。価格が平均を下回る場合は「買い」、翌日の価格がさらに下がれば「買い」を維持します。およびその逆。数が平均よりも多い場合は売却し、その後の日数がさらに多い場合は売却を保留します。理想的には、株で [9] 4 ユーロで買い、株で [11] 19 ユーロで売ります。ただし、売却するかどうかをチェックする場合、株式の次のインデックスをチェックしようとするため、範囲外の配列になってしまいます[11]。

public static void main(String[] args)
{
    int [] shares ={3,7,4,2,10,11,8,5,4,8,19};
    int average= 0;
    int  buyOrSell = 0;
    int profit = 0;

    for(int i = 0; i< shares.length; i++)
    {
        average += shares[i];
    }

    average  /= shares.length;
    System.out.println(average);

    for(int i = 0; i < shares.length; i++)
    {
            if((shares[i] <= average) && (buyOrSell == 0))
            {
                if((shares[i]) < (shares[i+1]))
                {
                System.out.println("Buy" + shares[i]);
                buyOrSell++;
                System.out.println("Profit: " + (profit -= shares[i]));
                }
                else System.out.println("Hold Buy" + shares[i]);

            }

            if(shares[i] >= average && buyOrSell == 1)
            {
                if((shares[i]) > (shares[i+1]))
                {
                System.out.println("Sell" + shares[i]);
                buyOrSell--;
                System.out.println("Profit: " + (profit += shares[i]));
                }

                else System.out.println("Hold Sell" + shares[i]);
            }


    }

    System.out.println("Profit: "+ profit);

}

Gambs ソリューションのおかげで、この if ステートメントを追加して問題を解決しました。

if((i == shares.length -1)  && buyOrSell == 1 && (shares[i] >= average)) 
        {
            System.out.println("Sell" + shares[i]);
            buyOrSell--;
            System.out.println("Profit: " + (profit += shares[i]));
            break;

        }
4

5 に答える 5

6

配列の最後に到達するshares[i+1]と、例外がスローされます。ループ内の制限を 1 減らす必要があります。for(int i = 0; i < shares.length - 1; i++)

于 2013-03-11T17:31:57.703 に答える
3

誰もが正しく提案したような範囲制限を実装することは別として、配列の最後の項目の境界ケースを検討する必要があります。まで繰り返すlength - 2と、位置にある要素はどうなりlength - 1ますか?

2 つの方法があります。length - 21 つは、ループ外の最後の要素まで反復してから処理することです。

for(int i = 0; i < shares.length - 1; i++)
//Your code
int finalShare = shares[length - 1];
//Manage the final item here

もう 1 つは、反復をそのまま維持し、反復の最後に到達したかどうかを判断する特定のチェックを追加し、最終要素を処理してから反復を中断することです。

for(int i = 0; i < shares.length; i++) {
    if(i == length - 1) {
        //handle final element here...
        break;
    }
}
于 2013-03-11T17:49:31.993 に答える
2

配列は 0 から始まるためshares[i+1]i == shares.length

ロジックに応じて、次のような多くのことができます。

変化する

if((shares[i]) < (shares[i+1]))

if((i+1 < shares.length) && (shares[i]) < (shares[i+1]))

または

if((shares[i-1]) < (shares[i]))

または、ループ内の条件を次のように変更できます

for(int i = 0; i < shares.length - 1; i++)

それはすべて、ロジックがどのように機能するかによって異なります

于 2013-03-11T17:34:48.510 に答える
1

2 番目forのループは index[i+1]を調べます。これは、ループの最後の反復の範囲外ですi == length - 1。これを修正するには、ループをlength - 1次のように繰り返す必要があります。

for(int i = 0; i < shares.length - 1; i++) 
{...}

これで、いつでもアクセスできます[i+1]

于 2013-03-11T17:33:13.957 に答える
0

ループは からi=0まで実行されi=shares.length-1ます。これは、 がとる最大値が であることを意味しiますshares.length-1。したがって、実行することは実行することshares[i+1]と同じshares[shares.length]です。ArrayIndexOutOfBoundsException配列インデックスが0notから始まるため、それが得られる理由です1。ループ条件を に変更することで回避できますi < shares.length-1

于 2013-03-11T17:38:05.773 に答える