在java中复制一个2d数组

rob*_*ran 48 java

我有一个名为矩阵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;
}
Run Code Online (Sandbox Code Playgroud)

Naw*_*Man 80

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

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

int [][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
    myInt[i] = matrix[i].clone();
Run Code Online (Sandbox Code Playgroud)

对于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);
}
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助.

编辑:修复bug.

  • 也可以使用Arrays.copyOf() (6认同)
  • 皮特是对的。但是Arrays.copyOf()使用System.arraycopy()并带有开销,假设结果的长度可能与原始长度不同。在这种情况下,我们可以确定结果的大小,因此使用clone()和System.arraycopy()是本机,效率更高。但是,也可以使用Arrays.copyOf()。 (2认同)
  • @PeteKirkham Arrays.copyOf()不会深度复制2D矩阵。它只是引用相同的二维数组。 (2认同)

Nic*_*ckF 14

可以使用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]);
}
Run Code Online (Sandbox Code Playgroud)

  • 对于单行 - 将所有lambdas折叠为方法引用`Arrays.stream(data).map(int [] :: clone).toArray(int [] [] :: new);`但是请注意,对于大型数组本机System.arraycopy应该(可能?)更快,除非你`并行()你的流. (7认同)
  • @NIA `clone()` 在 Oracle jvm 上的速度与 `System.arraycopy()` 基本相同:两者都是本机方法。您的代码是我在所有答案和评论中看到的最好的代码。 (2认同)

Ama*_*osh 7

您没有初始化本地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];
  }
}
Run Code Online (Sandbox Code Playgroud)