2009-11-06 12 views
37

i einen 2D-Array haben Matrizen vom Typ int genannt, die ich auf eine lokale Variable in einem Verfahren kopieren will, so kann ich eskopiert einen 2D-Array in Java

zu bearbeiten, was ist der beste Weg, um das Array zu kopieren, i

zum Beispiel einige Probleme habe

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

Einige Probleme. . was genau?? –

Antwort

5

Sie den lokalen 2D-Array nicht initialisiert.

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

Es gibt zwei gute Möglichkeiten zum Kopieren von Arrays ist die Verwendung von Klonen und System.arraycopy().

Hier ist, wie Klon zu verwenden, für die 2D-Fall:

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

Für System.arraycopy(), verwenden Sie:

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

Ich habe keine Benchmark, aber ich kann mit wetten meine 2 Cent, dass sie schneller sind und weniger fehleranfällig als es selbst tun. Insbesondere System.arraycopy(), wie es in nativem Code implementiert ist.

Hoffe, das hilft.

Bearbeiten: Fehler behoben.

+5

Arrays.copyOf() kann auch verwendet werden –

+1

Pete hat Recht. Aber Arrays.copyOf() verwendet System.arraycopy() mit einem Overhead für die Annahme, dass die Länge des Ergebnisses möglicherweise nicht identisch mit dem Original ist. In diesem Fall wissen wir mit Sicherheit, wie groß das Ergebnis ist. Daher ist es effizienter, clone() und System.arraycopy() zu verwenden, da sie nativ sind. Dennoch kann auch Arrays.copyOf() verwendet werden. – NawaMan

+0

@PeteKirkham Arrays.copyOf() kopiert keine 2D-Matrix tief. Es bezieht sich nur auf die gleichen zweidimensionalen Arrays. –

-10

können Sie auch so codieren myInt = matrix.clone();

+6

Das wird eine Matrix erstellen, die die Zeilenarrays wie das Original teilt –

10

Es ist möglich, Streams in Java 8 zu verwenden, um ein 2D-Array zu kopieren.

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

Für Einzeiler - reduzieren Sie alle Lambdas zu Methodenreferenzen 'Arrays.stream (Daten) .map (int [] :: Klon) .toArray (int [] [ ] :: new); 'Aber bitte beachten Sie, dass native System.arraycopy für große Arrays (wahrscheinlich?) schneller sein sollte, es sei denn Sie' parallel() 'Ihren Stream. – NIA

Verwandte Themen