Nested array references

int[] a = new int[] {9, 8, 3, 1, 5, 4};

for (int i = 0; i < a.length; i++){
    if (a[i] % 2 == 0)
        a[i] += 1;
    else if(a[i] < a.length)
        a[i] += a[a[i]];
}

|i | a[i] old | a[i] % 2 | a[i] < a.length | a[a[i]] | a[i] new |
|--|----------|----------|-----------------|---------|----------|
|0 |  9       |    -     |   -             |  NaN    |    9     |
|1 |  8       |    +     |   -             |  NaN    |    9     |
|2 |  3       |    -     |   +             |  1      |    4     |
|3 |  1       |    -     |   +             |  9      |    10    |
|4 |  5       |    -     |   +             |  4      |    9     |
|5 |  4       |    +     |   -             |  9      |    5     |

// a = {9, 9, 4, 10, 9, 5};

I thought that a[3] would equal 1

That's correct, at step 3, a[3] = 1

and then a[1] would equal 8

That's not correct, because at step 1 it was incremented to 9


Note the first condition - if (a[i] % 2 == 0) {a[i] += 1;} - this causes even values to be incremented. Therefore a[1] is incremented from 8 to 9.

Now, when i==3, a[a[i]] is evaluated to a[1] which is equal to 9. Then you are adding it to the original value of a[3] (note the operator is +=, not =), so a[3] becomes 1 + 9, which is 10.


Its okey. Best way to see what you are doing is debuggin(painting in this case) your code:

int[] a = new int[] {9, 8, 3, 1, 5, 4};

    for (int i = 0; i < a.length; i++){
        if (a[i] % 2 == 0){
            System.out.printf(a[i]);
            a[i] += 1;
            System.out.printf(a[i]);
        }else if(a[i] < a.length){
            System.out.printf(a[i]);
            a[i] += a[a[i]];
            System.out.printf(a[i]);
}

And you will see more clearly.Sometimes its better to face the wall by ourselves because one best practices is learn about you. Good luck!.

Tags:

Java

Arrays