Эта перезапись происходит из-за того, что вы каждый раз вносите изменения в один и тот же объект 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
, используя любой из методов ссылка
Вот он обновленный код для того же:
Код:
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;
}
}
person
Community
schedule
02.05.2020
QueenPos
статичен? Учитывая это, зачем вам заставлять конструктор заменять этот глобальный массив каждый раз, когда создается новый объектQueen
? Удалите _3 _ !!! - person Andreas   schedule 02.05.2020