在java中复制一个2d数组

时间:2009-11-06 09:21:54

标签: java

我有一个名为int的int类型的二维数组,我想复制到方法中的局部变量,所以我可以编辑它

什么是复制阵列的最佳方法,我遇到了一些麻烦

例如

    int [][] myInt;
    for(int i = 0; i< matrix.length; i++){
        for (int j = 0; j < matrix[i].length; j++){
            myInt[i][j] = matrix[i][j];
        }
    }

    //do some stuff here
    return true;
}

5 个答案:

答案 0 :(得分:77)

复制数组的两种好方法是使用clone和System.arraycopy()

以下是如何将克隆用于2D案例:

int [][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
    myInt[i] = matrix[i].clone();

对于System.arraycopy(),您使用:

int [][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
{
  int[] aMatrix = matrix[i];
  int   aLength = aMatrix.length;
  myInt[i] = new int[aLength];
  System.arraycopy(aMatrix, 0, myInt[i], 0, aLength);
}

我没有基准测试,但我可以用我的 2美分打赌,他们比自己做的更快,而且更不容易出错。特别是System.arraycopy(),因为它是在本机代码中实现的。

希望这会有所帮助。

编辑:修复错误。

答案 1 :(得分:12)

可以在Java 8中使用流来复制2D数组。

@Test
public void testCopy2DArray() {
   int[][] data = {{1, 2}, {3, 4}};
   int[][] dataCopy = Arrays.stream(data)
             .map((int[] row) -> row.clone())
             .toArray((int length) -> new int[length][]);

   assertNotSame(data, dataCopy);
   assertNotSame(data[0], dataCopy[0]);
   assertNotSame(data[1], dataCopy[1]);

   dataCopy[0][1] = 5;
   assertEquals(2, data[0][1]);
   assertEquals(5, dataCopy[0][1]);
}

答案 2 :(得分:6)

您没有初始化本地2D阵列。

int[][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
{
  myInt[i] = new int[matrix[i].length];
  for (int j = 0; j < matrix[i].length; j++)
  {
    myInt[i][j] = matrix[i][j];
  }
}

答案 3 :(得分:0)

如果数据很大,您应该考虑使用合适的线性代数库,例如 coltnd4j。如果数组是一维的,System.arraycopy 可能只会更快。否则它无法将整个数据复制为一个单元,然后像在 numpy 或 R 中那样对其进行整形。

答案 4 :(得分:-12)

你也可以像这样编码 myInt = matrix.clone();