2016-10-18 9 views
0

私はこのコードを使用してjavaの2次元マトリックスの行を反転します。そのような単純なコードのように思えますが、なんらかの理由でうまく機能しません。行列のrowNはもともと配列の値が代入なしで変更されています

112 42 83 119 

119 83 83 119 

になった私は、コードをデバッグし、tempMatrix2も変更されていることが分かりました。なぜ私は理解できません。行列[rowN] [i]に値を代入している同じ行のforループで変化します。 何か助けていただければ幸いです。

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

'matrix [rowN]'と 'tempMatrix2'は同じ配列です。一方を変更すると他方が変更されます。 – 4castle

+2

'int [] tempMatrix2 = matrix [rowN];を実行すると、ヒープ上の同じ配列オブジェクトに2番目の*参照を作成しています。それが理由です。あなたのアルゴリズムが機能するためには、*コピー*を作成する必要があります。しかし、配列を半分にし、残りの半分を*スワップ*値にフリップする方がはるかに簡単です。 –

+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とmatrixはヒープメモリ内の同じ場所を指しています。

行列の配列値を変更すると、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; 
} 
関連する問題