1

我正在尝试编写一个程序来最大化买卖股票的利润。我正在尝试检查下一个索引中的值是否大于当前索引位置中的值,但是我的循环导致数组超出范围。它发生在这一行 if((shares[i]) < (shares[i+1]).)防止这种情况的最佳方法是什么。

编辑:我得到了一份股价清单。每天我可以买或卖买或卖。我的方法是找到股价的平均值。如果价格低于平均水平,则“买入”,如果接下来的几天价格仍然较低,则持有“买入”。反之亦然。如果数量大于平均值,则卖出,如果之后的一天仍然更大,则持有卖出。理想情况下,在股票 [9] 我将以 4 欧元买入,在股票 [11] 我将以 19 欧元卖出。但是,在检查是否出售时,数组越界,因为它尝试检查 share[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]将抛出异常。您应该将循环中的限制减少一:for(int i = 0; i < shares.length - 1; i++)

于 2013-03-11T17:31:57.703 回答
3

除了像每个人都正确建议的那样实施范围限制之外,您还必须考虑数组最后一项的边界情况。如果您迭代 until length - 2,那么 position 中的元素会发生什么情况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;
    }
}
于 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

您的第二个for循环查看 index [i+1],该索引超出了循环的最后一次迭代 when 的范围i == length - 1。为了解决这个问题,你的循环应该length - 1这样迭代:

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

这样,您始终可以访问[i+1].

于 2013-03-11T17:33:13.957 回答
0

循环从i=0i=shares.length-1。这意味着 取的最大值ishares.length-1。因此,doingshares[i+1]等价于doing shares[shares.length]。这就是你得到的原因,ArrayIndexOutOfBoundsException因为数组索引从0not开始1。您可以通过将循环条件更改为 来避免它i < shares.length-1

于 2013-03-11T17:38:05.773 回答