Als Teil der Hausaufgaben müssen wir eine Merge-Sort implementieren. Keine große Sache, ich habe es schon einmal gemacht. Dieses Mal, obwohl ich eine IndexOutOfBoundsException
bekomme. Immer noch keine große Sache, nicht schwer zu reparieren.Etwas löscht 3 Elemente aus meiner ArrayList
Aber ich ein wenig zu graben, und ich am Ende in einer while-Schleife in meiner merge Methode mit dem folgenden Code auf:
private static void merge(ArrayList<T> data, int first, int mid, int last) {
ArrayList<T> temp = new ArrayList<T>();
int first1 = first, last1 = mid;
int first2 = mid+1, last2 = last;
int index = first1;
while (first1 <= last1 && first2 <= last2) {
System.out.println("still in while loop");
System.out.println(data);
if (data.get(first1).compareTo(data.get(first2)) < 0) {
temp.add(index, data.get(first1));
first1++;
} else {
temp.add(index, data.get(first2));
first2++;
}
index++;
System.out.println(data);
}
while (first1 <= last1) {
temp.set(index, data.get(first1));
first1++;
index++;
}
while (first2 <= last2) {
temp.set(index, data.get(first2));
first2++;
index++;
}
data.clear();
for (index=first; index <= last; index++)
data.add(index, temp.get(index));
}
Die Ausgabe endet so etwas wie:
noch in while-Schleife
[8800, 2596, 7518, 9900, 7164]
[8800, 2596, 7518, 9900, 7164]
noch in while-Schleife
[2596, 8800]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Größe: 2
So etwas ist passiert zwischen der letzten Zeile vor der Schleife und den ersten beiden Zeilen in der while-Schleife, die 3 Zahlen aus meiner ArrayList löscht. Das Problem ist: Ich kann mir nicht vorstellen was. Ich entferne überhaupt keine Daten in der while-Schleife. Ich füge nur Daten zu einer anderen ArrayList hinzu. Die while-Bedingung hat nichts mit der ArrayList zu tun. Kurz gesagt, ich bin verloren.
Der Fehler ist offenbar im späteren Teil der Methode. Ich weiß immer noch nicht, was los ist, und der Stack-Trace für die IndexOutOfBoundsException
zeigt immer noch auf eine Zeile in der while-Schleife (speziell if (data.get(first1).compareTo(data.get(first2)) < 0) {
), aber es ist nur reproduzierbar, wenn dieser Code dort ist. Also bin ich immer noch verloren.
Was ist hier oben? Wie repariere ich es?
Gibt es einen anderen (gleichzeitigen) Thread, der diese Variable ändern könnte? Ist dieses Problem reproduzierbar? –
keine gleichzeitige Threads, und es ist reproduzierbar, aber der Fehler ist im späteren Teil meiner Methode, die ich jetzt hinzufügen –
Was sind die Werte der ersten, mittleren und letzten, wenn Sie die Funktion Merge aufrufen? – scoots