У меня проблема с Arraylist, здесь он перезаписывает последний объект (называемый Queen), который я добавляю в evreything в Arraylist

    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;
  }

person Duha    schedule 02.05.2020    source источник
comment
Почему QueenPos статичен? Учитывая это, зачем вам заставлять конструктор заменять этот глобальный массив каждый раз, когда создается новый объект Queen? Удалите _3 _ !!!   -  person Andreas    schedule 02.05.2020
comment
Я пытаюсь удалить статическое электричество, но проблема все еще существует :(   -  person Duha    schedule 02.05.2020
comment
@Duha Можете ли вы привести пример того, что вы пробовали, и какого результата вы ожидаете?   -  person    schedule 02.05.2020
comment
Я создаю объект Queen q с помощью QueenPos = {0,1,2,0} и передаю его функции GenareteQueen, чтобы вернуть Arraylist include. Объекты имеют QueenPos, например {0,1,2,0}, {1,1,2,0} , {2,1,2,0}, {3,1,2,0} но список массивов возвращает мне объекты с такими объектами QueenPos {3,1,2,0}, {3,1,2,0 }, {3,1,2,0}, {3,1,2,0} @ Prerna-Gupta   -  person Duha    schedule 02.05.2020
comment
@Duha Было бы гораздо лучше, если бы вы отредактировали вопрос и прояснили его с помощью примеров, а не с помощью комментариев. Вопрос должен стоять сам по себе, и люди не должны читать комментарии. Удалите комментарий, как только добавите информацию к самому вопросу.   -  person Andreas    schedule 02.05.2020


Ответы (1)


Эта перезапись происходит из-за того, что вы каждый раз вносите изменения в один и тот же объект 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