2016-10-18 16 views
0

我正在使用此代碼在java中的2維矩陣中翻轉一行。它看起來像這樣一個簡單的代碼,但由於某種原因,它不起作用。矩陣的rowN原是數組的值不變

112 42 83 119 

成爲

119 83 83 119 

我調試的代碼,並發現該tempMatrix2也正在發生變化。我不明白爲什麼。它在for循環中在我爲其賦值給矩陣[rowN] [i]的同一行中變化。 任何幫助表示讚賞。

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

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

    return matrix; 
} 
+6

'矩陣[rowN]'和'tempMatrix2'是同一個數組。修改其中一個會修改另一個。 – 4castle

+2

當你做'int [] tempMatrix2 = matrix [rowN];'你正在爲堆上的同一個數組對象創建第二個*引用*。這就是爲什麼。爲了讓你的算法起作用,你需要做一個*拷貝*。但是有更簡單的方法可以在數組中僅翻轉一半,並將*值與另一半交換。 –

+1

更容易的可能是'列表 reverser = Arrays.asList(matrix [rowN]); Collections.reverse(反向);矩陣[rowN] =反向;'。或切換到更多的功能範例,如[流](http://stackoverflow.com/questions/tagged/java-stream)或[kotlin](http://stackoverflow.com/questions/tagged/kotlin)。 –

回答

0

在這種情況下,tempMatrix2和矩陣指向堆內存中的相同位置。

如果更改矩陣中的數組值,它將反映在tempMatrix2中,反之亦然。

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 } 

而不是做tempMatrix2 =矩陣,你需要創建一個新的整數數組對象並將其賦值給tempMatrix2,然後從矩陣陣列複製所有的值到這個新的對象。這裏是我建議的做法:

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