2013-03-11 33 views
0

我正在努力編寫一個程序,以最大化在買賣股票中獲得的利潤。我正在嘗試檢查下一個索引中的值是否大於當前索引位置中的值,但是我的循環導致數組超出範圍。如果((份額[i])<(份額[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; 

     } 
+0

您是否在調試器中運行此操作來觀察失敗的行?或者甚至讀你的異常來確定失敗的那一行? – djechlin 2013-03-11 17:32:46

回答

2

除了像所有人都正確建議的那樣實施範圍限制之外,您還必須考慮邊界案例作爲陣列的最後一項。如果迭代到length - 2,那麼位置length - 1中的元素會發生什麼情況?

您可以採取兩種方法。一個是迭代直到length - 2,然後處理循環外的最後一個元素。

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

另一種包括在保持迭代,因爲它是,同時加入特定的檢查,其確定如果迭代的結尾已經到達,處理的最終元件和然後打破了迭代。

for(int i = 0; i < shares.length; i++) { 
    if(i == length - 1) { 
     //handle final element here... 
     break; 
    } 
} 
+0

謝謝Gamb。這很有幫助。 – Calgar99 2013-03-11 18:01:43

4

當您到達數組末尾時,shares[i+1]將引發異常。你應該減一回路中的限制:for(int i = 0; i < shares.length - 1; i++)

+0

但是這不允許檢查我是否應該在最後一個指數中出售? – Calgar99 2013-03-11 17:33:50

+0

請您重新編寫您的評論..這很難理解。 – user 2013-03-11 17:36:34

+0

道歉我會盡力在主帖中澄清。 – Calgar99 2013-03-11 17:43:43

1

你的第二個for循環如下指標[i+1],這是出界了循環的最後一次迭代中,當i == length - 1的。爲了解決這個問題,您應該循環迭代到length - 1這樣:

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

這樣,您就可以隨時訪問[i+1]

1

數組從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++) 

這一切都取決於你的邏輯是如何工作的

+0

我正準備解決你的問題......很好的答案。 – KMX 2013-03-11 17:51:59

0

的循環運行從i=0i=shares.length-1。這意味着i採用的最大值爲shares.length-1。因此,做shares[i+1]就等於做shares[shares.length]。這就是爲什麼你得到ArrayIndexOutOfBoundsException,因爲數組索引從0開始而不是1。您可以通過將環路條件更改爲i < shares.length-1來避免它。