0

I am trying to copy a 2d array of ints to another,such that the original remains unaffected when copied array is modified

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

However,the original gets modified here

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 

I tried clone() ,still the behaviour is the same

Why is this? Any idea how to keep the original unmodified?

2

5 Answers 5

1

You are just coping 1d array references to your new array t4. That is why your reference t4 still points to your old 1d arrays.

You should use a loop to replace 'deeper' arrays:

for (int i = 0; i < t3.length; i++) {
    System.arraycopy(t3[i], 0, t4[i], 0, t3[0].length);
}
Sign up to request clarification or add additional context in comments.

Comments

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

Try this:

Comments

1

You need to copy each array of your 2d array.

Using 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);

Comments

0

Just use this method

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

Then call it where you like as

t4 = produceAcopy2DArray(t3);  

Then you will keep the original unmodified as you need

Comments

0

The copy utilities in Java will not copy a multidimensional array. You must iterate over the array and assign the values into a new array.

 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
        }

1 Comment

why the .length - 1 in the for loop?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.