2013-04-18 3 views
0

Я делаю программу Soloku Solver на Java, которая использует обратный трассировку и грубую силу для алгоритма решения. Кажется, что проблема заключается в том, что когда я вставляю правильные значения в простой контейнер, неправильные значения отображаются, когда я пытаюсь получить к нему доступ из другого класса.В поисках некоторых рекомендаций относительно HashMap

HashMap имеет правильные значения в правильных местах, когда я распечатать его изнутри методом вставки в Sudokucontainer, (с for(int i = 0 i < dim; i++) + for(int j = 0; j < dim; j++)) с последующим Square[][] tmp = solutionsHash.get(count) и System.out.println(tmp[i][j].getValue());. Это также успешное, когда я использую то же самое для-петлю сразу после solutions.insert заявления в Square класса fillInnRemainingOfBoard() (с последующего Square[][] tmp = solutions.solutionsHash.get(count) и то же System.out.println заявлением.

Проблема возникает, когда я пытаюсь сделать то же самое с Board класса , как вы можете видеть в моем методе test() в этом классе, тогда он просто распечатывает предопределенные значения (или ничего, если плата пуста). Единственное отличие состоит в том, что я тогда использую то, что Square[][] tmp = allSquares[0][0].solutionsHash.get(wantedNumber) и то же, что и раньше. как я уже упоминал, я не понимаю, почему это должно иметь значение, когда solutionsHash объявлены статическими в классе.

Любой h elp сильно аппроксимируется. Благодаря!

ПРИМЕЧАНИЕ: Отступ, полученный каким-то образом, извините. Я не включил часть GUI, потому что я не написал это, и у меня, возможно, нет разрешения на его включение. Кроме того, перед этим возникает проблема (возможно, в классе Board), так как там же указаны значения из класса Board.

EDIT: Удалено ненужный код.

public class Square { 

static Sudokucontainer solutions; 
protected char value; 
protected int valueInt; 
protected static Square allSquares[][]; 
public int count = 0; 
protected boolean predefined = false; 
protected boolean lastSquare = false; 
protected Square next = null; 


public void setNext() { 
if(col.getNr() < col.dim) { 
    next = allSquares[row.getNr()-1][col.getNr()]; 
}else if(col.getNr() == col.dim) { 
    if(row.getNr() < row.dim) { 
    next = allSquares[row.getNr()][0]; 
    }else { 
    next = null; 
    lastSquare = true; 
    } 
} 
if(next != null) { 
    if(next.col.getNr() == col.dim && next.row.getNr() == col.dim && next.predefined == true) 
    lastSquare = true; 
} 
} 
public void fillInnRemainingOfBoard(Square[][] allSquares, int hd, int br) { 

    this.allSquares = allSquares; 
int highestNumber = col.dim; 
setNext(); 

if(value == '\u0020') { 
    for(int i = 1; i <= highestNumber; i++) { 
    if(row.isLegal[i-1] && col.isLegal[i-1] && box.isLegal[i-1]) { 
     String s1 = Integer.toString(i); 
     value = s1.charAt(0); 
     insert(value); 
     insertInt(i); 
     box.isLegal[i-1] = false; 
     col.isLegal[i-1] = false; 
     row.isLegal[i-1] = false; 
     if(!lastSquare) { 
     next.fillInnRemainingOfBoard(this.allSquares, hd, br); 
     }else{ 
     System.out.println("Solution found: " + count); 
     solutions.insert(allSquares, count, col.dim); 
     ++count; 
     } // Slutt paa else 
     box.isLegal[valueInt-1] = true; 
     col.isLegal[valueInt-1] = true; 
     row.isLegal[valueInt-1] = true; 
     value = '\u0020'; 
     } // Slutt paa if(row.isLegal[i-1] && col.isLegal[i-1] && box.isLegal[i-1])  
    } // Slutt paa if (value == '\u0020' || !predefined) 
}else {  
    if(!lastSquare) { 
    next.fillInnRemainingOfBoard(this.allSquares, hd, br); 
    } else { 
    System.out.println("Solution found"); 
    solutions.insert(allSquares, count, col.dim); 
    count++; 
    } 
} // Slutt paa else if(predefined)  
// Slutt paa for(int i = 1; i <= highestNumber; i++) 
}// Her returnerer vi til forrige metode 

public void insert(char value) { 
if(value != '.') { 
    this.value = value; 

}else{ 
    this.value = '\u0020'; // In other words; space(in unicode) 
} 
} 

public void insertInt(int value) { 
valueInt = value; 
} 



public char getValue() { 
return value; 
} 

} 

public class Sudokucontainer { 

int dim = 0; 
private int count = 0; 
static HashMap<Integer, Square[][]> solutionsHash = new HashMap<Integer, Square[][]>(); 

public void insert(Square[][] allSquares, int count, int dim) { 
this.count = count; 
this.dim = dim; 

if(count <= 499) { 
    solutionsHash.put(count,allSquares); 
} 

} 

public Square[][] get(int nr) { 
Square[][] tmp = solutionsHash.get(nr); 
return tmp; 
} 

public int getSolutionCount() { 
return solutionsHash.size(); 
} 

} 

public class Board { 

int dim, br, hd; 
char[][] charArray; 
char[] charArray1; 
static Square [][] allSquares; 
Row [] rows; 
Column[] columns; 
Box[] boxes; 

    public Board(int dim, int br, int hd, char[][] charArray) { 
this.dim = dim; 
this.br = br; 
this.hd = hd; 
this.charArray = charArray; 
charArray1 = new char[dim]; 
allSquares = new Square[dim][dim]; 
rows = new Row[dim]; 
columns = new Column[dim]; 
boxes = new Box[dim/br * dim/hd]; 
setRows(); 
setColumns(); 
setBoxes(); 
setSquares(); 
insertBoxInSquares(); 
fillInLegalValues(); 
welcome(); 
solve(); 
test(); 
System.out.println("Found solutions. Please refer to the graphical interface."); 
showGui(); 


} 


public void test() { 
    for(int i = 0; i < dim; i++) { 
     for(int j = 0; j < dim; j++) { 
     //Square[][] tmp = allSquares[0][0].solutions.solutionsHash.get(0); 
     //System.out.println(tmp[i][j].getValue()); 
     } 
    } 
} 

public void solve() { 

allSquares[0][0].fillInnRemainingOfBoard(allSquares, hd, br); 

} 

public void showGui() { 
new SudokuGUI(dim, hd, br, allSquares[0][0].solutions.solutions, false, 0, allSquares[0][0].solutions.solutionsHash); 
} 

} 
+1

Это код. – maba

+2

Я попытаюсь удалить ненужный код. – Promille

+0

@ user2291525: это поможет, если вы удалите ненужный код –

ответ

0

Я могу вам сказать, в чем проблема, хотя и не причина.

Вы либо печатаете разные объекты, либо значения объекта меняются между одной печатью и другой. Вы можете идентифицировать объект, распечатав либо его хэш-код, либо вызов toString() объекта, и, следовательно, укажите, является ли он одним и тем же объектом в разных случаях.

Если они разные, я бы проверял, что вы не загружаете объект с временной областью в одном случае и печатаете один с большим объемом в следующем случае. Но также возможно, что вы просто ссылаетесь на другой объект; Я не могу сказать, что происходит с кодом, который вы опубликовали, возможно, вы запутались.

Название вашего сообщения является причиной, по которой я говорю это. Просто невозможно, чтобы «значения в [hashmap] неверны». Когда человек довольно новичок в программировании, а иногда и в последующие годы, половина отладки полагает, что (1) конструкции языка программирования действительно работают как рекламируемые, и (2) вы где-то прикручивались.

+0

Спасибо @rcook. Объект, казалось, был таким же в соответствии с хэш-кодом.Я не могу понять, почему это произошло, и хотя я думаю, что интересно искать решение, у меня нет времени на это прямо сейчас. Поэтому я пошел с другим решением (3D-массив). Тем не менее, для меня все еще загадка, потому что я использовал ту же процедуру для массива (насколько я могу видеть в любом случае), но это работало как шарм. Вы совершенно правы, что заголовок вводит в заблуждение/неправильно. Если возможно, я изменю его. Еще раз спасибо. – Promille

Смежные вопросы