2016-12-07 2 views
1

Я пытаюсь выполнить итерацию по списку «breadthBoard» и добавить к нему массив «доска». Однако каждый массив, который я добавляю в массив, каким-то образом превращается в исходный массив, который затем дублируется, хотя я тестировал массив, который был изменен.Невозможно добавить в ArrayList

neighbourNodes - это список, который содержит все значения, смежные с currentNode на плате.

public List breadthBoard(List neighbourNodes, int [] currentNode, int [][] board) 
{ 

    int x = currentNode[0] - 1; 
    int y = currentNode[1] - 1; 
    //create lists 
    List breadthBoard = new ArrayList(); 

for (int i=0; i<3;i++) 
     { 
      for(int j=0; j<3;j++) 
      { 

       if (neighbourNodes.contains(board[i][j])) 
       { 
        // the temp variables allow me to switch the values then switch back later on 
        int temp = board[i][j]; 
        int temp2 = board[x][y]; 
        //initial switch 
        board[i][j] = temp2; 
        board[x][y] = temp;// at this point I get a successful swap but it isn't getting added to the breadth board 
        breadthBoard.add(board); 

        //test to see if I get the right results which I do 
        System.out.println("what's being added into breadth board (should be swapped)" + Arrays.deepToString(board)); 
        System.out.println('\n'); 

        switching the values back to the original postions 
        board[i][j] = temp; 
        board[x][y] = temp2; 
        System.out.print("back to normal " + Arrays.deepToString(board));// another test passed 
        System.out.println('\n'); 

       } 

      } 
+0

Где вы получаете 'x' и' y' от и что neighbourNodes ? –

+1

Нам нужно знать больше о том, что происходит. Где объявляется ширина, утверждается, что это за тип? –

+0

Я добавлю остальную часть метода –

ответ

0

Я сделал несколько тестов. Действительно, clone() делает глубокую копию с массивом примитивных типов, но она не работает одинаково с массивом примитивов с двумя размерами.
с массивом с двумя размерами, вы должны перебирать на первом измерении и выполнить clone() на int[] массив второго измерения:

board[i][j] = temp2; 
    board[x][y] = temp; 

    //Here, I suppose that the second dimension has always the same size. 
    int[][] clonedBoard = new int[board[0].length][board[1].length]; 

    for (int t = 0; t < board.length; t++) { 
    clonedBoard[t] = board[t].clone(); 
    } 
    breadthBoard.add(clonedBoard); 
+0

вы, сэр, благословили меня, если бы я мог остановиться, я бы –

+0

:) Нет проблем. Для информации, чтобы этот способ сделать, своп больше не требуется. Идея состоит в том, чтобы сначала клонировать массив, затем вы модифицируете непосредственно клонированный массив. – davidxxx

0

Вам необходимо сделать способ, который делает глубокую копию board. clone делает только мелкую копию.

Я бы посоветовал оберточной доску внутри класса, который имеет swap метод, который просто возвращает новый совет:

class Board { 
    private final int[][] board; 

    public Board(Board other) { 
     this.board = new int[other.board.length][]; 
     for(int i = 0; i < board.length; i++) { 
      board[i] = Arrays.copyOf(other.board[i], other.board[i].length); 
     } 
    } 

    public Board swap(int i, int j, int x, int y) { 
     Board result = new Board(this); // copy this board 

     // swap elements  
     result.board[i][j] = board[x][y]; 
     result.board[x][y] = board[i][j]; 

     return result; 
    } 

    ... 

} 
// in the loops 
breadthBoard.add(board.swap(i, j, x, y)); 
Смежные вопросы