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;
}
'matrix [rowN]'と 'tempMatrix2'は同じ配列です。一方を変更すると他方が変更されます。 – 4castle
'int [] tempMatrix2 = matrix [rowN];を実行すると、ヒープ上の同じ配列オブジェクトに2番目の*参照を作成しています。それが理由です。あなたのアルゴリズムが機能するためには、*コピー*を作成する必要があります。しかし、配列を半分にし、残りの半分を*スワップ*値にフリップする方がはるかに簡単です。 –
さらに簡単です。リスト reverser = Arrays.asList(matrix [rowN]); Collections.reverse(リバーサ);行列[rowN] =リバーサ; '。または、[ストリーム](http://stackoverflow.com/questions/tagged/java-stream)や[kotlin](http://stackoverflow.com/questions/tagged/kotlin)などのより機能的なパラダイムに切り替えることもできます。 –