Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Thursday, March 17, 2016

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

Popular Posts

Powered by Blogger.