Ich hab da ein kleinen Problem in einen Rekursiven Backtracking Algorithmus.
In der Methode getCord(Klasse opportunities) wird eine ArrayList an die Methode SetStone(Klasse Main) zurückgegeben in der der Fehler zu stecken scheint. Da die ArrayList wiederum eine ArrayList beinhaltet die wiederum n intArray beinhaltet blick ich langsam nicht mehr durch. SetStone läuft Rekursiv und gibt nach ca 2500 Durchläufen einen StackOverflowError.
Methode SetStone ais der Klasse main:
Methode getCord in der Klasse opportunities
Methode oppAnalyse in der Klasse opportunities (Belegung der Werte die an die main zurückgegeben werden sollen)
DANKE
EDIT - exception vergessen:
Exception in thread "main" java.lang.StackOverflowError
at sun.nio.cs.SingleByteEncoder.encodeLoop(Unknown Source)
at java.nio.charset.CharsetEncoder.encode(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.i
utputStreamWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.PrintStream.write(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at opportunities.printField(opportunities.java:31)
at opportunities.getCord(opportunities.java:70)
at main.setStone(main.java:88)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.newLevel(main.java:62)
at main.setStone(main.java:109)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.newLevel(main.java:62)
at main.setStone(main.java:109)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.newLevel(main.java:62)
at main.setStone(main.java:109)
at main.newLevel(main.java:62)
at main.setStone(main.java:109)
at main.newLevel(main.java:62)
at main.setStone(main.java:109)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.newLevel(main.java:62)
.
. -viele viele weitere-
.
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.goBack(main.java:52)
In der Methode getCord(Klasse opportunities) wird eine ArrayList an die Methode SetStone(Klasse Main) zurückgegeben in der der Fehler zu stecken scheint. Da die ArrayList wiederum eine ArrayList beinhaltet die wiederum n intArray beinhaltet blick ich langsam nicht mehr durch. SetStone läuft Rekursiv und gibt nach ca 2500 Durchläufen einen StackOverflowError.
Methode SetStone ais der Klasse main:
Java:
public void setStone() {
tempOpp = List.get(count);
ArrayList<int[]> opps;
for(int i=0; i<9; i++)
for(int j=0; j<9; j++)
playingField[i][j] = tempOpp.playingField[i][j];
System.out.println("Anz. Moeglichkeiten = "+tempOpp.allOpps.size());
if(tempOpp.getAnz() == 1){
System.out.println("\nENDE... mit " +count +" Zügen!");
return;
}
opps = tempOpp.getCord();
if(opps == null){
System.out.println("\n\n\nback_________________________");
goBack();
mainCount++;
}
else{
mainCount++;
System.out.println("Anz. Durchläufe: "+mainCount);
System.out.println("Anz. Sprünge: "+List.size());
System.out.println("setStone say-> I get cords: "+((int[])opps.get(0))[0] +" ; " +((int[])opps.get(0))[1]);
System.out.println("setStone say-> I get cords: "+((int[])opps.get(1))[0] +" ; " +((int[])opps.get(1))[1]);
System.out.println("setStone say-> I get cords: "+((int[])opps.get(2))[0] +" ; " +((int[])opps.get(2))[1]+"\n");
playingField[((int[])opps.get(0))[0]][((int[])opps.get(0))[1]] = '#';
playingField[((int[])opps.get(1))[0]][((int[])opps.get(1))[1]] = '#';
playingField[((int[])opps.get(2))[0]][((int[])opps.get(2))[1]] = 'O';
newLevel();
}
Methode getCord in der Klasse opportunities
Java:
public ArrayList getCord() {
printField();
ArrayList<ArrayList> tempallOpps = null;
if(allOpps.isEmpty() || allOpps.size()<= 0) {
System.out.print("getCord() says-> allOpps are Empty, i call goBack()");
return null;
}
else {
tempallOpps = new ArrayList<ArrayList>(allOpps.get(allOpps.size()-1));
System.out.println("getCord sys -> return ok");
allOpps.remove(allOpps.size()-1);
}
return tempallOpps;
}
Methode oppAnalyse in der Klasse opportunities (Belegung der Werte die an die main zurückgegeben werden sollen)
Java:
public void oppAnalyse() {
for(int i=0; i<9;i++) {
for(int j=0; j<9;j++) {
if(i>2 && playingField[i][j] == 'O') {
if(playingField[i-2][j] == '#' && playingField[i-1][j] == 'O') {
opps = new ArrayList<int[]>();
opps.add(new int[]{i,j});
opps.add(new int[]{i-1,j});
opps.add(new int[]{i-2,j});
allOpps.add(opps);
System.out.println("opp add1 "+i+j +";"+(i-1)+j+";"+(i-2)+j);
}
}
if(j>2 && playingField[i][j] == 'O')
if(playingField[i][j-2] == '#' && playingField[i][j-1] == 'O') {
opps = new ArrayList<int[]>();
opps.add(new int[]{i,j});
opps.add(new int[]{i,j-1});
opps.add(new int[]{i,j-2});
allOpps.add(opps);
System.out.println("opp add2 "+i+j +";"+i+(j-1)+";"+i+(j-2));
}
if(i<7 && playingField[i][j] == 'O')
if(playingField[i+2][j] == '#' && playingField[i+1][j] == 'O') {
opps = new ArrayList<int[]>();
opps.add(new int[]{i,j});
opps.add(new int[]{i+1,j});
opps.add(new int[]{i+2,j});
allOpps.add(opps);
System.out.println("opp add3 "+i+j +";"+(i+1)+j+";"+(i+2)+j);
}
if(j<7 && playingField[i][j] == 'O')
if(playingField[i][j+2] == '#' && playingField[i][j+1] == 'O') {
opps = new ArrayList<int[]>();
opps.add(new int[]{i,j});
opps.add(new int[]{i,j+1});
opps.add(new int[]{i,j+2});
allOpps.add(opps);
System.out.println("opp add4 "+i+j +";"+i+(j+1)+";"+i+(j+2));
}
}
}
}
DANKE
EDIT - exception vergessen:
Exception in thread "main" java.lang.StackOverflowError
at sun.nio.cs.SingleByteEncoder.encodeLoop(Unknown Source)
at java.nio.charset.CharsetEncoder.encode(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.i
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.PrintStream.write(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at opportunities.printField(opportunities.java:31)
at opportunities.getCord(opportunities.java:70)
at main.setStone(main.java:88)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.newLevel(main.java:62)
at main.setStone(main.java:109)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.newLevel(main.java:62)
at main.setStone(main.java:109)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.newLevel(main.java:62)
at main.setStone(main.java:109)
at main.newLevel(main.java:62)
at main.setStone(main.java:109)
at main.newLevel(main.java:62)
at main.setStone(main.java:109)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.newLevel(main.java:62)
.
. -viele viele weitere-
.
at main.goBack(main.java:52)
at main.setStone(main.java:92)
at main.goBack(main.java:52)