電子書籍の厳選無料作品が豊富!

例えば

55555
55505
55555

のような二次元配列があったときに、
値が0の場合、十字の方向に0に置き換えるプログラムを作りたいです。

55505
00000
55505

しかし、現在のプログラムでは

55500
00000
00000

このようになってしまいます。

System.out.println(i);
これは内容をチェックするために書いていますが、
私の想定ではiは1になるのですが、
1と2が出力されます。
この2がなぜ入るのかが分かりません。。。

どのように修正したらよいか、ご教示いただきたく存じます。
よろしくお願いいたします。

public class test {
public static void main(String[] args) {

int[][] matrix = new int[][] {
{4, 4, 4, 4, 4},
{4, 4, 4, 0, 4},
{4, 4, 4, 4, 4},
};

//新しい配列を用意し置き換える
int[][] changeMatrix = matrix;

for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] == 0) {
System.out.println(i);
for (int k = 0; k < changeMatrix.length; k++) {
int l = j;
changeMatrix[k][l] = 0;
}
for (int m = 0; m < changeMatrix[0].length; m++) {
int n = i;
changeMatrix[n][m] = 0;
}
}
}
}

//変更後の二次元配列を出力
System.out.println("変更後");
for (int i = 0; i < changeMatrix.length; i++) {
for (int j = 0; j < changeMatrix[0].length; j++) {
System.out.print(changeMatrix[i][j]);
}
System.out.println();
}
}
}

A 回答 (1件)

int[][] changeMatrix = matrix;



代入してもコピーが作られるわけではなく
changeMatrixとmatrixが同じ配列データを
参照するようになるだけのため
changeMatrixを変えると、matrixも変わってしまいます。

ですので、以下のように新しい配列を作る必要があります。

int[][] changeMatrix = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++) {
 changeMatrix[i] = java.util.Arrays.copyOf(matrix[i], matrix[i].length);
}
    • good
    • 1
この回答へのお礼

できました!!!

別の配列として扱えるものだと思っておりましたので
大変勉強になりました。

大変助かりました、ありがとうございます!!

お礼日時:2021/09/01 21:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!