Эта перезапись происходит потому, что вы каждый раз вносите изменения в один и тот же QueenPos[]
объект Queen
объекта.
Пример:
First Iteration
:
Вы получили queenPos [] в g [], который равен {0,1,2,0}, и он обновлен до {0,1,2,0}
Second Iteration
g [] = QueenPos [] = {0,1,2,0}, и его обновили до {1,1,2,0}.
Поскольку g [] ссылается на queenpos [], то, что бы вы ни делали в g [], они также отражаются и на queenPos [] (g [] - мелкая копия queenPos []).
Итак, после первой итерации ваш queenPos [] был изменен на {1,1,2,0}, так как вы храните g[]
, который косвенно равен queenPos [] в вашем списке массивов gen
, и он был изменен на { 1,1,2,0}. Таким образом, это значение обновляется при 0 и 1 индексе списка массивов.
Таким образом, чтобы решить эту проблему, вы можете создать новую (глубокую) копию этого QueenPos[]
объекта в каждой итерации for
l oop, используя любой из методов link
Вот он обновил код для того же:
Код:
public static ArrayList<ExpressionTree> GenarateQueen (ExpressionTree q,int col){
ArrayList<ExpressionTree> gen=new ArrayList<ExpressionTree>() ;
for (int i = 0; i < q.QueenPos.length; i++) {
int g[] = new int[q.QueenPos.length];
System.arraycopy(q.QueenPos, 0, g, 0, 4);
g[col]=i;
gen.add(i,new ExpressionTree(g));
int a[]=gen.get(i).QueenPos;
int r=0;
}
for (int i = 0; i < gen.size(); i++) {
for (int k = 0; k < gen.get(i).QueenPos.length; k++) {
System.out.print(" | "+gen.get(i).QueenPos[k]+" | ");
}
System.out.println();
}
return gen;
}
Ouput
| 0 | | 1 | | 2 | | 0 |
| 1 | | 1 | | 2 | | 0 |
| 2 | | 1 | | 2 | | 0 |
| 3 | | 1 | | 2 | | 0 |
Через эту строку System.arraycopy(q.QueenPos, 0, g, 0, 4);
Я создаю новый массив g
каждый раз из исходного queenPos[]
, вместо изменения в том же queenPos[]
.
И также, согласно комментарию, вы также можете удалить поля static
из вашего конструктора , , Поэтому обновленный объект Queen должен быть:
public class Queen{
int QueenPos[];
int her;
int N;
public ExpressionTree(int[] queenPos) {
this.QueenPos=queenPos;
this.her = getHer();
this.N=getQueenPos().length;
}
public ExpressionTree() {
}
public int getHer() {
return her;
}
public int[] getQueenPos() {
return QueenPos;
}
public void setQueenPos(int queenPos[]) {
QueenPos = queenPos;
}
}