У меня есть проблема с Arraylist, здесь он перезаписывает последний объект (называемый "Queen"), который я добавляю к чему-либо в Arraylist - PullRequest
0 голосов
/ 02 мая 2020
    public class Queen {

    static int QueenPos[];
    public int her;
    int N;

     public Queen() {

     }
    public Queen(int[] queenPos) {
        this.QueenPos=queenPos;
        this.her = getHer();
        this.N=getQueenPos().length;
    }

    public static int[] getQueenPos() {
      return QueenPos;
    }

    public static void setQueenPos(int queenPos[]) {
      QueenPos = queenPos;
    } 

в этой функции я добавляю объект Queen в Arraylist, и у меня есть проблема с перезаписью в arraylist

  public static ArrayList<Queen> GenarateQueen (Queen q,int col){
    ArrayList<Queen> gen=new ArrayList<Queen>() ;


    for (int i = 0; i < q.QueenPos.length; i++) {
        int g [] = q.getQueenPos();
        g[col]=i;
        gen.add(i,new Queen(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;
  }

1 Ответ

1 голос
/ 02 мая 2020

Эта перезапись происходит потому, что вы каждый раз вносите изменения в один и тот же 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;
            } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...