From: Peter on 27 May 2010 09:55 Hi, I really can't figure this out and it is quite upsetting that i am not able to solve a apparently very simple problem. But after shifting de elements in an array one position to the left using System.arraycopy, the last and 2nd last element in the array is changed when re-setting the value of the last element. Something tells me that the last and 2nd last element do point to the same instance, but do not get this simple issue solved. I added the method and output to demonstate what my problem is. I expected the output Column:0[null,null,] Column:1[null,null,] Column:2[null,null,] Column:3[null,25,] Column:4[null,24,] public void arraytest() { Integer[][] data = new Integer[5][2] ; System.out.println("Initialized values") ; for (int a=0 ; a < data.length ; a++ ) { System.out.print("Column:" + a + "[") ; for (int b=0 ; b < data[a].length ; b++ ) { System.out.print(data[a][b] + ",") ; } System.out.println("]") ; } data[4][1] = 25 ; System.out.println("Changed one value") ; for (int a=0 ; a < data.length ; a++ ) { System.out.print("Column:" + a + "[") ; for (int b=0 ; b < data[a].length ; b++ ) { System.out.print(data[a][b] + ",") ; } System.out.println("]") ; } int numelmts = data.length-1 ; System.arraycopy(data , 1 , data , 0 , numelmts) ; System.out.println("Shifted all values one position to the left") ; for (int a=0 ; a < data.length ; a++ ) { System.out.print("Column:" + a + "[") ; for (int b=0 ; b < data[a].length ; b++ ) { System.out.print(data[a][b] + ",") ; } System.out.println("]") ; } data[4][1] = 24 ; System.out.println("Changed same column/row value") ; for (int a=0 ; a < data.length ; a++ ) { System.out.print("Column:" + a + "[") ; for (int b=0 ; b < data[a].length ; b++ ) { System.out.print(data[a][b] + ",") ; } System.out.println("]") ; } } Initialized values Column:0[null,null,] Column:1[null,null,] Column:2[null,null,] Column:3[null,null,] Column:4[null,null,] Changed one value Column:0[null,null,] Column:1[null,null,] Column:2[null,null,] Column:3[null,null,] Column:4[null,25,] Shifted all values one position to the left Column:0[null,null,] Column:1[null,null,] Column:2[null,null,] Column:3[null,25,] Column:4[null,25,] Changed same column/row value Column:0[null,null,] Column:1[null,null,] Column:2[null,null,] Column:3[null,24,] Column:4[null,24,]
From: Eric Sosman on 27 May 2010 10:33 On 5/27/2010 9:55 AM, Peter wrote: > Hi, > > I really can't figure this out and it is quite upsetting that i am not > able to solve a apparently very simple problem. But after shifting de > elements in an array one position to the left using System.arraycopy, > the last and 2nd last element in the array is changed when re-setting > the value of the last element. Something tells me that the last and > 2nd last element do point to the same instance, but do not get this > simple issue solved. You're on the right track, but you haven't gone quite far enough. Remember that a two-dimensional array in Java is really a one-dimensional array containing references to one-D arrays: Integer[][] data = new Integer[5][2]; .... is quite similar to Integer[] d0 = new Integer[] { null, null }; Integer[] d1 = new Integer[] { null, null }; Integer[] d2 = new Integer[] { null, null }; Integer[] d3 = new Integer[] { null, null }; Integer[] d4 = new Integer[] { null, null }; Integer[][] data = { d0, d1, d2, d3, d4 }; .... the main difference being that we now have names for the lower-level arrays. With me so far? Your code now sets data[4][1] = 26, which is the same as setting d4[1] = 25. Everything looks the same as above, except that the second null in d4 is replaced by a reference to an Integer. Then you use System.arrayCopy(data, 1, data, 0, data.length - 1); .... and here's where I think your understanding begins to falter. After this, the contents of the outer array, data, are { d1, d2, d3, d4, // shifted over by arrayCopy() d4 } // undisturbed Note that the five elements of data are references to just four arrays, with two references to the d4 array. Both of data[3] and data[4] are references to d4: There's one single d4 array with two references pointing at it: data[0] -> { null, null } data[1] -> { null, null } data[2] -> { null, null } data[3] -+ +-> { null, 25 } data[4] -+ Now I hope you can see what's happening. When you assign data[4][1] = 24 it's the same as d4[1] = 24. You could have achieved the same result with data[3][1] = 24, because both data[3] and data[4] refer to the same d4 array. -- Eric Sosman esosman(a)ieee-dot-org.invalid
From: Peter on 27 May 2010 13:37 Hi Eric, Thanks for the Excellent explanation! Peter
|
Pages: 1 Prev: Top 10 Technical requirements for In-Memory Reporting Next: Placement of Constants - again |