kopieer een 2D-array in java

ik heb een 2D-array genaamd matrix van het type int die ik in een methode naar een lokale variabele wil kopiëren, zodat ik deze kan bewerken

wat is de beste manier om de array te kopiëren, ik heb wat problemen

bijvoorbeeld

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

Antwoord 1, autoriteit 100%

Er zijn twee goede manieren om arrays te kopiëren, namelijk door clone en System.arraycopy()te gebruiken.

Hier leest u hoe u kloon voor 2D-cases gebruikt:

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

Voor System.arraycopy(), gebruik je:

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);
}

Ik heb geen benchmark, maar ik kan met mijn 2 centwedden dat ze sneller en minder foutgevoeligzijn dan wanneer u het zelf doet. Vooral System.arraycopy()zoals het is geïmplementeerd in native code.

Ik hoop dat dit helpt.

Bewerken: bug opgelost.


Antwoord 2, autoriteit 19%

Het is mogelijk om streams in Java 8 te gebruiken om een 2D-array te kopiëren.

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

Antwoord 3, autoriteit 7%

U initialiseert de lokale 2D-array niet.

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

Antwoord 4

Als de gegevens groot zijn, kunt u overwegen een goede lineaire algebrabibliotheek te gebruiken, zoals coltof nd4j. System.arraycopyzal waarschijnlijk alleen veel sneller zijn als de array eendimensionaal zou zijn. Anders kan het niet de volledige gegevens als één eenheid kopiëren en het vervolgens hervormen zoals in numpy of R.


Antwoord 5

je kunt ook zo coderen
mijnInt = matrix.kloon();

Other episodes