Wie um zu verhindern, array out of bounds
Ich versuche, ein Programm zu schreiben, um zu maximieren den Gewinn in den Kauf und Verkauf von Aktien. Ich bin versucht, zu überprüfen, ob der Wert in den nächsten index der größer ist als der Wert im aktuellen index-position jedoch meine loops Ergebnisse im array out of bounds. Seinen Auftritt in dieser Zeile wenn((Aktie[i]) < (Aktie[i+1]).) Was ist der beste Ansatz, um dies zu verhindern.
Edit: ich habe eine Liste der Aktienkurse. Jeden Tag kann ich entweder kaufen oder zu verkaufen, zu kaufen oder zu verkaufen. Mein Ansatz ist der Durchschnitt der Aktienkurse. Wenn der Preis unter dem Durchschnitt liegt, dann "kaufen", wenn die nächsten Tage der Preis noch niedriger halten Sie dann "kaufen". Und Umgekehrt. wenn Zahl größer ist als der Durchschnitt dann verkaufen, wenn der Tag danach ist noch größer, dann halten Verkauf. Idealerweise auf Aktien[9] werde ich kaufen, bei 4 Euro und auf Aktien[11] werde ich verkaufen bei €19. Jedoch, wenn es darum geht zu prüfen, ob zu verkaufen oder nicht, endet array out of bounds, da Sie versuchen, überprüfen Sie die nächste index nach Aktien[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);
}
Dank Gambs Lösung, die ich Hinzugefügt dieser if-Anweisung, um mein problem zu lösen.
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;
}
- Haben Sie diese in einem debugger zu beobachten, die Zeile, die fehlschlägt? Oder Lesen Sie sogar Ihre Ausnahme bestimmen Sie die Zeile, die fehlschlägt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abgesehen von der Umsetzung einer Reihe Einschränkung wie jeder richtig vorgeschlagen, die Sie haben, zu betrachten die Grenze Fall für das Letzte Element des Arrays. Wenn Sie Durchlaufen, bis
length - 2
was passiert mit mit dem element in der positionlength - 1
?Gibt es zwei Ansätze, die Sie ergreifen können. Man ist zu iterieren, bis
length - 2
und dann die Handhabung das Letzte element außerhalb der Schleife.Die andere besteht darin, die iteration, wie es ist, während Sie eine bestimmte Prüfung, die bestimmt, ob das Ende der iteration erreicht wurde, behandelt das Letzte element und dann bricht die iteration.
Wenn Sie erreichen das Ende des Arrays, die
shares[i+1]
wird eine exception werfen. Sollten Sie verringern die Grenze in der Schleife um eins:for(int i = 0; i < shares.length - 1; i++)
Ihre zweite
for
Schleife sieht auf den index[i+1]
, was ist aus Grenzen für die Letzte iteration der Schleife, wenni == length - 1
. Um dies zu beheben, Ihre Schleife Durchlaufen zulength - 1
als solche:Diese Weise können Sie immer Zugriff auf
[i+1]
.Arrays beginnen bei 0, so
shares[i+1]
ist out of bounds, wenni == shares.length
Je nach Ihrer Logik, es gibt eine Menge Dinge, die Sie tun können, wie
ändern
zu
oder
oder ändern Sie können die Bedingung in der Schleife zu
es hängt alles davon ab, wie Ihre Logik funktioniert
Läuft die Schleife von
i=0
zui=shares.length-1
. Dies bedeutet, dass der maximale Wert, der durchi
istshares.length-1
. Daher tunshares[i+1]
entspricht dabeishares[shares.length]
. Das ist, warum Sie bekommenArrayIndexOutOfBoundsException
weil array-Indizes beginnen von0
nicht1
. Sie können dies vermeiden, indem die änderung der Schleifenbedingung zui < shares.length-1
.