在java中复制一个二维数组

ct2axkht  于 2022-12-25  发布在  Java
关注(0)|答案(5)|浏览(202)

我有一个2D数组,称为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;
}
avwztpqn

avwztpqn1#

复制阵列有两种很好的方法,即使用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 cents打赌,它们比自己做更快,更不容易出错,特别是System.arraycopy(),因为它是用本机代码实现的。

vd2z7a6w

vd2z7a6w2#

在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]);
}
stszievb

stszievb3#

您没有初始化本地二维数组。

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];
  }
}
irtuqstp

irtuqstp4#

如果数据量很大,你应该考虑使用一个合适的线性代数库,比如coltnd4jSystem.arraycopy可能只有在数组是一维的情况下才会有意义地更快,否则它无法将整个数据作为一个单元复制,然后将其重新整形为numpy或R。

tkclm6bt

tkclm6bt5#

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

相关问题