2016-10-18 4 views
0

Ich verwende nur diesen Code, um eine Zeile in einer zweidimensionalen Matrix in Java umzukehren. es scheint so ein einfacher Code zu sein, aber aus irgendeinem Grund funktioniert es nicht. Die Rown einer Matrix war ursprünglichWert eines Arrays ändert sich ohne Zuweisung

112 42 83 119 

wurde
119 83 83 119 

ich den Code auf Fehler und fand heraus, dass die tempMatrix2 auch geändert wird. Ich kann nicht verstehen warum. Es ändert sich in der for-Schleife in derselben Zeile, in der ich der Matrix [rowN] [i] einen Wert zuweise. Jede Hilfe wird geschätzt.

+6

'Matrix [rowN]' und 'tempMatrix2' sind das gleiche Array. Das Ändern eines wird das andere ändern. – 4castle

+2

Wenn Sie 'int [] tempMatrix2 = Matrix [rowN];' erstellen, erstellen Sie eine zweite * Referenz * für dasselbe Array-Objekt auf dem Heap. Deshalb. Damit Ihr Algorithmus funktioniert, müssen Sie eine * Kopie * erstellen. Aber es gibt viel einfachere Möglichkeiten zum Umdrehen - gehen Sie nur zur Hälfte in das Array und tauschen Sie die Werte mit der anderen Hälfte. –

+1

Noch einfacher könnte sein 'List reverser = Arrays.asList (Matrix [rowN]); Collections.reverse (Umkehrer); Matrix [rowN] = Umkehrer; '. Oder wechseln Sie zu einem funktionelleren Paradigma wie [Streams] (http://stackoverflow.com/questions/tagged/java-stream) oder [kotlin] (http://stackoverflow.com/questions/tagged/kotlin). –

Antwort

0

In diesem Fall zeigen tempMatrix2 und Matrix auf die gleiche Stelle im Heap-Speicher.

Wenn Sie den Array-Wert in der Matrix ändern, wird er in der tempMatrix2 widergespiegelt und umgekehrt.

Original array {112, 42, 83, 119} 

Here, n = 4 
For example, let's say rowN = 0 

When i = 0, 
matrix[0][0] = tempMatrix[0][3]; 
The state is now: 
matrix = {119, 42, 83, 119}, 
tempMatrix = {119, 42, 83, 119 } 

When i = 1, 
matrix[0][1] = tempMatrix[0][2]; 
Since tempMatrix[0][2] = 83, 
matrix = {119, 83, 83, 119}, 
tempMatrix = {119, 83, 83, 119 } 

Statt tempMatrix2 = Matrix zu tun, müssen Sie ein neues Integer-Array-Objekt erstellen und zu tempMatrix2 zuweisen und dann kopieren Sie alle Werte aus dem Matrix-Array in dieses neue Objekt. Hier ist, wie ich vorschlage, es zu tun:

static int[][] flipRow(int[][] matrix, int rowN, int n) { 
    int[] tempMatrix2 = new int[n]; 

    for(int i = 0; i < n; i++) { 
     tempMatrix2[i] = matrix[rowN][i]; 
    } 

    for(int i = 0; i < n; i++) { 
     matrix[rowN][i] = tempMatrix2[n-i-1]; 
    } 

    return matrix; 
}