Arrays.fill()

Discussion in 'Java' started by Ike, Jul 1, 2003.

1. IkeGuest

Yow! This doesnt do what I thought it would do! If I have a 2D boolean
array, and say I set a tuple to all false, then go to set the other tuples
using Arrays.fill as in the third line below:

boolean brod[][]= new boolean[3][3];
Arrays.fill(brod[0],true);
Arrays.fill(brod,brod[0]);

Then, if I subsequently set, say brod[0][1]=true; then all brod[?][1] become
true.....but I dont want that at all! How can I use Arrays.fill to fill a 2D
(or N-D) array? thanks, Ike
Ike, Jul 1, 2003

"Ike" <> wrote:
> Yow! This doesnt do what I thought it would do! If I have a 2D boolean
> array, and say I set a tuple to all false, then go to set the other tuples
> using Arrays.fill as in the third line below:
>
> boolean brod[][]= new boolean[3][3];
> Arrays.fill(brod[0],true);
> Arrays.fill(brod,brod[0]);
>
> Then, if I subsequently set, say brod[0][1]=true; then all brod[?][1]

become
> true.....

Because all the brod[?] refer to the same array after your line 3.

> but I dont want that at all! How can I use Arrays.fill to fill a 2D
> (or N-D) array? thanks, Ike

You can't, not in the way you want.

If your array is always 3 x 3, you might get away with:

boolean[][] brod = new boolean[][] {
{true, true, true,},
{true, true, true,},
{true, true, true,},
};

If not, you'll have to write some loops to set the elements.

The key to understanding this behaviour is that the statement:

boolean brod[][] = new boolean[3][3];

does not declare a two-dimensional array of booleans as it would in C/C++.
In Java this declares brod as an array of references to arrays of booleans.
So, your second call to Arrays.fill:

Arrays.fill(brod,brod[0]);

sets each element of brod to point to the array referenced by brod[0]; that
is, now all three elements in brod point to the same array. So, of course
setting brod[0][1]=true means brod[1][1] will also be true, since brod[0]
and brod[1] point to the same array.

"Ike" <> wrote in message
news:eI3Ma.72388\$...
> Yow! This doesnt do what I thought it would do! If I have a 2D boolean
> array, and say I set a tuple to all false, then go to set the other tuples
> using Arrays.fill as in the third line below:
>
> boolean brod[][]= new boolean[3][3];
> Arrays.fill(brod[0],true);
> Arrays.fill(brod,brod[0]);
>
> Then, if I subsequently set, say brod[0][1]=true; then all brod[?][1]

become
> true.....but I dont want that at all! How can I use Arrays.fill to fill a

2D
> (or N-D) array? thanks, Ike
>
>
Adam P. Jenkins, Jul 1, 2003