我正在努力编写一个程序,以最大化买卖股票的利润。我试图检查下一个索引中的值是否大于当前索引位置中的值,但是我的循环导致数组超出范围。它出现在 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;
}
答案 0 :(得分:6)
当你到达数组的末尾时,shares[i+1]
将抛出异常。您应该将循环中的限制减少一个:for(int i = 0; i < shares.length - 1; i++)
答案 1 :(得分: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;
}
}
答案 2 :(得分:1)
第二个for
循环查看索引[i+1]
,它在i == length - 1
时超出循环的最后一次迭代的范围。要解决此问题,您的循环应该迭代到length - 1
:
for(int i = 0; i < shares.length - 1; i++)
{...}
这样,您始终可以访问[i+1]
。
答案 3 :(得分: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++)
这一切都取决于你的逻辑如何工作
答案 4 :(得分:0)
循环从i=0
到i=shares.length-1
。这意味着i
占用的最大值为shares.length-1
。因此,执行shares[i+1]
等同于执行shares[shares.length]
。这就是为什么你得到ArrayIndexOutOfBoundsException
,因为数组索引从0
而不是1
开始。您可以通过将循环条件更改为i < shares.length-1
来避免它。