0

コピーされた配列が変更されたときに元の配列が影響を受けないように、intの2次元配列を別の配列にコピーしようとしています

            int[][] t3 = new int[][]{
            {1,2,3},
            {0,4,6},
            {7,8,9}
        };
        show(t3);

        int[][] t4 = new int[t3.length][t3[0].length];
        System.arraycopy(t3, 0,t4 ,0, t3.length-1);
        show(t4);

        t3[0][0]=99;
        show(t3);
        show(t4);

ただし、元はここで変更されます

t3
1 2 3 
0 4 6 
7 8 9 

t4
1 2 3 
0 4 6 
0 0 0 

t3 modified
99 2 3 
0 4 6 
7 8 9 

t4
99 2 3 
0 4 6 
0 0 0 

clone() を試しましたが、動作は同じです

どうしてこれなの?オリジナルを変更せずに保つ方法はありますか?

4

5 に答える 5

1
for(int i = 0; i < t3.length; i++)
    t4[i] = t3[i].clone();

これを試して:

于 2013-03-11T08:41:00.893 に答える
1

1d配列参照を新しい配列t4にコピーしているだけです。そのため、参照t4はまだ古い1d配列を指しています。

'deeper'配列を置き換えるには、ループを使用する必要があります。

for (int i = 0; i < t3.length; i++) {
    System.arraycopy(t3[i], 0, t4[i], 0, t3[0].length);
}
于 2013-03-11T08:41:47.237 に答える
1

2D配列の各配列をコピーする必要があります。

Arrays.copyOf (int []、int)の使用:

int[][] t4 = new int[t3.length][];
for(int i = 0 ; i < t3.length ; ++i) {
    t4[i] = Arrays.copyOf(t3[i], t3[i].length);
}
show(t4);
于 2013-03-11T08:41:51.230 に答える
0

この方法を使用するだけです

public static int[][] produceAcopy2DArray(int[][] original) {
    int [][] copied = new int[original.length][];
    for(int i = 0; i < original.length; i++)
        copied[i] = original[i].clone();
    return copied;
}  

次に、好きな場所でそれを呼び出します

t4 = produceAcopy2DArray(t3);  

次に、必要に応じて元のファイルを変更せずに保持します

于 2013-03-11T08:51:20.753 に答える
0

Java のコピー ユーティリティは、多次元配列をコピーしません。配列を繰り返し処理し、値を新しい配列に割り当てる必要があります。

 public static void main(String[] args) {
            int[][] t3 = new int[][] { { 1, 2, 3 }, { 0, 4, 6 }, { 7, 8, 9 } };

            int[][] t4 = new int[t3.length][t3[0].length];

            for (int x = 0; x < t3.length - 1; x++) {
                for (int y = 0; y < t3[x].length - 1; y++) {
                    t4[x][y] = t3[x][y];
                }
            }

            t4[0][0] = 99;
            System.out.println(t3[0][0]); //Prints 1
            System.out.println(t4[0][0]); //Prints 99
        }
于 2013-03-11T08:53:32.807 に答える