【问题标题】:cloning a 2d String array in java在java中克隆一个二维字符串数组
【发布时间】:2014-04-19 06:12:40
【问题描述】:

我正在编写一个具有父节点的程序。该父节点有一个二维字符串数组和包含父二维字符串数组但有修改的子节点。但是,当我创建孩子的二维数组时,它会继续使用对父数组的引用。这样在孩子创建结束时,父数组就有了所有孩子的修改。我尝试使用 System.arraycopy、Arrays.copyOf 创建一个复制构造函数,但都无济于事。 这是构造函数

public class Board
{
 private String[][] Gameboard;
 public Board(Board parent)
 {
  this.Gameboard = parent.Gameboard;
 }
}

我也尝试过遍历数组并一一分配字符串,但这也不起作用。 我这样调用构造函数:

Board temp = new Board(parent);

【问题讨论】:

    标签: java arrays reference clone deep-copy


    【解决方案1】:

    您可以使用复制构造函数,如下例:

    public class Test {
        String[][] arr2D = new String[2][2];
    
        public Test() {
        }
    
        public Test(Test t) {
            this.arr2D = deepCopy(t.arr2D);
        }
    
        // deepCopy
        private String[][] deepCopy(String[][] arr2D) {
        String[][] arr2D2 = new String[arr2D.length][arr2D.length];
          for (int i = 0; i < arr2D.length; i++) {
             for (int j = 0; j < arr2D.length; j++) {
                arr2D2[i][j] = arr2D[i][j];
             }
          }
           return arr2D2;
        }
    
        public void setArr2D(String[][] arr2D) {
            for (int i = 0; i < arr2D.length; i++) {
                for (int j = 0; j < arr2D.length; j++) {
                    arr2D[i][j] = i + "row " + j + "column";
                }
            }
        }
    
        public String[][] getArr2D() {
            return this.arr2D;
        }
    
        public static void main(String[] args) {
            Test t1 = new Test();
            t1.setArr2D(t1.getArr2D());
            System.out.println(Arrays.deepToString(t1.getArr2D()));
            Test t2 = new Test(t1);
            t2.setArr2D(t1.getArr2D());
            System.out.println(Arrays.deepToString(t2.getArr2D()));
        }
    }
    

    【讨论】:

      【解决方案2】:

      试试这个:

      class parent {
          static String[][] Gameboard = new String[5][5];
      
          public static void main (String[] args) {
              for(int i = 0; i < 5; i++) {
                  for(int j = 0; j < 5; j++) {
                      Gameboard[i][j] = "" + j;
                  }
              }
              Board b = new Board();
          }
      } 
      
      class Board { 
          private String[][] Gameboard;
      
          public Board() { 
              this.Gameboard = parent.Gameboard; 
              for(int i = 0; i < 5; i++) {
                  for(int j = 0; j < 5; j++) {
                      System.out.print("" + this.Gameboard[i][j]);
                  }
                  System.out.print("\n");
              }   
              System.out.print("Lenght Of Class Boar.GameBoard =" + this.Gameboard.length);  
          } 
      }
      

      【讨论】:

        猜你喜欢
        • 2013-10-31
        • 2019-05-09
        • 2021-10-06
        • 2013-10-10
        • 2021-06-12
        • 2010-12-19
        • 2014-12-08
        • 1970-01-01
        • 2020-05-11
        相关资源
        最近更新 更多