This week's giveaway is in the EJB and other Java EE Technologies forum. We're giving away four copies of EJB 3 in Action and have Debu Panda, Reza Rahman, Ryan Cuprak, and Michael Remijan on-line! See this thread for details.
My background is over 50 years of programming 3rd generation languages so much of what I code is colored by that experience. Now I am coding java & many things I don't understand. Can someone help me to understand the following problem.
I need a 2-d array, array, of !0 rows by 4 columns. The members of the array are booleans & I need to be able to set array(row, column) to TRUE or FALSE
In Java define a 2-D array:
Next define an array of booleans and initialize 4 elements to false:
Finally set up 10 rows of 4 columns of booleans:
To set an element at (2,3) to true
But what happens is every row's column 3 is set to true;
In order to get the array set to work properly the construction of the rowOFBooleans must be put inside the 'for loop'.
My surmise is that in the first case Java doesn't store the values of rowOfBooleans in the twoDArray but rather stores a pointer to the ArrayList rowOfBooleans. Thus when ever an element is changed each row is pointing to the same rowOfBooleans.
In the second case each row is pointing to a different rowOfBooleans.
Richard Mittleman wrote:My surmise is that in the first case Java doesn't store the values of rowOfBooleans in the twoDArray but rather stores a pointer to the ArrayList rowOfBooleans. Thus when ever an element is changed each row is pointing to the same rowOfBooleans.
Richard Mittleman wrote:In the second case each row is pointing to a different rowOfBooleans.
Richard Mittleman wrote:Can anyone help me understand what is happening?
You appear to understand it pretty well.
Note however that an array is not the same thing as an ArrayList. So if you do need a 2-D array, you may want to follow Wouter's hint.
Joined: Apr 19, 2010
Yes I do need ArrayLists as the number of rows & columns can increase as the program is running.
Joined: Apr 19, 2010
It may seem that I understand it from the outside but from the inside of my head the question keeps coming up "Why is it done that way?
or change your iteration to create a new list for each row:
Note that the pointers to the false value from the first list will be used (it is a shallow copy) but we are protected since Booleans are immutable and you will need to supply a new instance rather than changing the value of the instance.
I also prefer Boolean.valueOf(false) but that is outside the scope of the question