Deep Copy Multidimensional Array
Deep Copy Multidimensional Array
I am creating a new board obtained by exchanging two adjacent blocks in the same row on an original board. The problem is that the new board overrides the content of the original board.
For example:
int[][] origBoard = { { 0, 4, 6 }, { 5, 3, 1 }, { 2, 8, 7 } }; int[][] twinBoard = { { 0, 6, 4 }, { 5, 3, 1 }, { 2, 8, 7 } };
What happens is that the origBoard becomes the same as the twinBoard when I assert the following:
Board B = new Board(origBoard); Board b = B.twin(); assertFalse("Calling twin() modifies the original Board.", B.equals(b));
My code is as follows:
public class Board { private int[][] goalBoard; private final Node node; private class Node { private int[][] board; private int move; private Node next; } // construct a board from an N-by-N array of blocks // (where blocks[i][j] = block in row i, column j) public Board(int[][] blocks) { int N = blocks.length; goalBoard = new int[N][N]; for (int i = 0; i < dimension(); i++) { for (int j = 0; j < dimension(); j++) { if (i == N - 1 && j == N - 1) { goalBoard[i][j] = 0; } else { goalBoard[i][j] = N * i + (j + 1); } } } // initial node node = new Node(); node.board = blocks; node.move = 0; node.next = null; } // board dimension N public int dimension() { return goalBoard.length; } // a board obtained by exchanging two adjacent blocks in the same row public Board twin() { int[][] testBoardATwin = new int[dimension()][dimension()]; testBoardATwin = node.board; int x = node.board[0][0]; int y = node.board[0][1]; // DEFAULT if (x != 0 && y != 0) { testBoardATwin[0][0] = y; testBoardATwin[0][1] = x; } // 2x2 if (dimension() == 2 || y == 0) { if (x == 0 || y == 0) { x = node.board[1][0]; y = node.board[1][1]; testBoardATwin[1][1] = x; testBoardATwin[1][0] = y; } } else { if (x == 0) { testBoardATwin[0][1] = node.board[0][2]; testBoardATwin[0][2] = y; } } Board board = new Board(testBoardATwin); return board; } // does this board equal y? public boolean equals(Object y) { Board testBoard = (Board) y; if (testBoard == null) { return false; } for (int i = 0; i < dimension(); i++) { for (int j = 0; j < dimension(); j++) { if (testBoard.node.board[i][j] != node.board[i][j]) { return false; } } } return true; } }
What am i doing wrong? Please help. Thank you.
Answer by Bigtoes for Deep Copy Multidimensional Array
int[][] testBoardATwin = new int[dimension()][dimension()]; testBoardATwin = node.board;
This is where your problem is. If you want to make a new
one, don't follow that up by immediately changing it to the old one.
But the comments are right, too. A straightforward copy and modification would make more sense.
Answer by Tim Bender for Deep Copy Multidimensional Array
This is the problem:
int[][] testBoardATwin = new int[dimension()][dimension()]; testBoardATwin = node.board;
Everything starts off well when the code makes a new int[][] array, but then it immediately discards that new array and just uses the one belonging to the instance twin
is called on.
Instead, what needs to happen is for node.board
to be index by index, or by using something like Arrays.copyOf
.
Answer by Iman for Deep Copy Multidimensional Array
To make an object you have to follow these instructions:
- First of all you have to make the class final
- Make all fields final and private.
- Don't provide "setter" methods
- Don't allow subclasses to override methods.
- Notice that no Methods that modify state
And One of the best reference you can refer that http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html
Answer by Igor Lukyanenkov for Deep Copy Multidimensional Array
node = new Node(); node.board = blocks;
And same tricky place here in Board constructor. You not copying your input array but assigning a reference to a class member property.
Answer by newbie for Deep Copy Multidimensional Array
In order to deep copy the multi-dimensional array, I did this:
private static int[][] copy2d(int[][] nums) { int[][] copy = new int[nums.length][]; for (int i = 0; i < copy.length; i++) { int[] member = new int[nums[i].length]; System.arraycopy(nums[i], 0, member, 0, nums[i].length); copy[i] = member; } return copy; } int[][] testBoardATwin = copy2d(node.board);
Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72
0 comments:
Post a Comment