Hallo,
Ich probiere mich gerade an einer Aufgabe des BWINF bei der ich ein Problem mit einem Stackoverflowerror habe.
Vorab: Ich habe schon einen (vielleicht nicht perfekten) Ansatz und suche hier nur nach einer Lösung zu diesem Ansatz.
Zunächst einmal zur Aufgabe: Die Aufgabe ist Aufgabe 3 auf diesem Aufgabenblatt.
Es geht darum, dass man 3 Behälter mir Biebern hat, die aber auch in 2 Behälter passen würden.
ZUm Glück gibt es einen Telepator. Er funktioniert so:
Nehmen wir an im ersten Behälter sind a Bieber, im zweiten b Bieber. Zusätzlich gilt a<b.
Wenn man den Telepator nun auf diese 2 Behälter richtet, so befinden sich dannach im ersten Behälter a-b und im zweiten 2b Bieber.
Mithilfe dieses Verfahrens sollen in einem Behälter am Ende 0 Bieber sein.
Die Methode in der das Problem auftritt ist dazu da, die beste Lösung zu finden wenn nicht direkt vorhersehbar ist, was man machen soll.
Kurz zur Klasse Lösug für Ideal.
Sie speichert zwei Integer ( Status und Züge) und ein Integer-Array(Lösung) der Status gibt an, wie einfach Lösung zu lösen ist. Höher ist besser und die Züge, wie viele Züge man dafür braucht.
Alle Variablen können mit Getter-Methoden abgerufen werden, einzig die Züge variable kann erhöht werden(immer nur um 1).
Offensichtlich wird der Error durch das Aufrufen der Methode herbeigeführt.
Aber ich dachte, da ich immer Zufallswerte verwende, sollte es nicht zu diesem Error kommen.
Könnt ihr mir helfen?
Weitere Code-Schnipsel gerne auf Nachfrage, ich will euch nicht zumüllen
Danke schonmal,
snokes
Ich probiere mich gerade an einer Aufgabe des BWINF bei der ich ein Problem mit einem Stackoverflowerror habe.
Vorab: Ich habe schon einen (vielleicht nicht perfekten) Ansatz und suche hier nur nach einer Lösung zu diesem Ansatz.
Zunächst einmal zur Aufgabe: Die Aufgabe ist Aufgabe 3 auf diesem Aufgabenblatt.
Es geht darum, dass man 3 Behälter mir Biebern hat, die aber auch in 2 Behälter passen würden.
ZUm Glück gibt es einen Telepator. Er funktioniert so:
Nehmen wir an im ersten Behälter sind a Bieber, im zweiten b Bieber. Zusätzlich gilt a<b.
Wenn man den Telepator nun auf diese 2 Behälter richtet, so befinden sich dannach im ersten Behälter a-b und im zweiten 2b Bieber.
Mithilfe dieses Verfahrens sollen in einem Behälter am Ende 0 Bieber sein.
Die Methode in der das Problem auftritt ist dazu da, die beste Lösung zu finden wenn nicht direkt vorhersehbar ist, was man machen soll.
Java:
private static LösungFürIdeal _BesteRandom(int[] arr)
{
//Zur Überprüfung was das Beste ist
int besteZüge = Integer.MAX_VALUE;
LösungFürIdeal lösung = null;
if(Ideal(arr).getStatus()>0)
return Ideal(arr);
LösungFürIdeal[] lösungen = new LösungFürIdeal[3];
//Zufällige Paare um Stackoverflow zu vermeiden
//Speichert in einem 3*2 Array für die einzelnen Lösungen vom array lösungen 2 Indices, die getauscht werden
int[][] paare = new int[3][2];
Random r = new Random();
//Schleife um alle 3 zu Befüllen
//Da es für alles eine Möglichkeit gibt wird trotz Zufall das kürzeste herauskommen
for(int i = 0; i< 3;i++)
{
do {
try {
Thread.sleep(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
//Array mit Länge 2 mit 2 Zufälligen ints von 0-2 befüllen(beide inklusive)
int[] insert = new int[2];
System.out.println("Zufallswerte:");
insert[0] = r.nextInt(3);
insert[1] = r.nextInt(3);
System.out.println(insert[0]);
System.out.println(insert[1]);
//Wenn der eine int gleich dem anderen ist geht die Schleife weiter (man kann nicht einen index
//mit sich selbst vertauschen
if(insert[0]==insert[1])
continue;
//Das Array wird der Größe der Werte nach sortiert
Arrays.sort(insert);
paare[i] = insert;
boolean cond = true;
for (int j = 0; j < 3&&cond; j++)
{
if(i!=j)
{
System.out.println("ArrayVergleich:");
for(int k = 0; k < 2&&cond;k++)
{
System.out.println(paare[i][k]);
System.out.println(paare[j][k]);
}
if(Arrays.equals(paare[i],paare[j]))
{
System.out.println("Arrays GLEICH");
cond = false;
}
System.out.println("ARRAYS UNGLEICH");
}
}
System.out.println("SCHLEIFE BEENDET");
break;
}
while(true);
//Schleife oben wenn Die ZUfallswerte nicht die gleichen sind
//Und wenn diese Zufallswerte nicht schjon so existieren
}
for (int i = 0; i < paare.length; i++)
{
//Ruft diese Methode mit einem Neuen Array auf
//Die Rekursion geht so lange, bis irgendwann der Status > 0 ist
lösungen[i] = _BesteRandom(Ändere(arr,paare[i][0],paare[i][1]));
}
//Hier wird aus den 3 Möglichen Tauschungen die Beste Ausgewählt
for (LösungFürIdeal lo:lösungen)
{
lo.erhöheZüge();
if(lo.getZüge()+lo.getZügeFürStatus()<besteZüge)
lösung = lo;
}
//Und hier zurückgegeben
return lösung;
}
Kurz zur Klasse Lösug für Ideal.
Sie speichert zwei Integer ( Status und Züge) und ein Integer-Array(Lösung) der Status gibt an, wie einfach Lösung zu lösen ist. Höher ist besser und die Züge, wie viele Züge man dafür braucht.
Alle Variablen können mit Getter-Methoden abgerufen werden, einzig die Züge variable kann erhöht werden(immer nur um 1).
Exception in thread "main" java.lang.StackOverflowError
at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:691)
at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
at java.iutputStreamWriter.write(OutputStreamWriter.java:207)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
at java.io.PrintStream.write(PrintStream.java:526)
at java.io.PrintStream.print(PrintStream.java:669)
at java.io.PrintStream.println(PrintStream.java:806)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:154)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
usw.
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
Process finished with exit code 1
at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:691)
at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
at java.iutputStreamWriter.write(OutputStreamWriter.java:207)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
at java.io.PrintStream.write(PrintStream.java:526)
at java.io.PrintStream.print(PrintStream.java:669)
at java.io.PrintStream.println(PrintStream.java:806)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:154)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
usw.
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
Process finished with exit code 1
Aber ich dachte, da ich immer Zufallswerte verwende, sollte es nicht zu diesem Error kommen.
Könnt ihr mir helfen?
Weitere Code-Schnipsel gerne auf Nachfrage, ich will euch nicht zumüllen
Danke schonmal,
snokes