Вложенные ссылки на массив

В настоящее время я изучаю Java онлайн, и меня смущает следующий код и то, для чего оценивается один из элементов в массиве:

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

Я смотрю на a[3] и число, к которому это относится, и когда я отлаживаю код, моя IDE показывает, что a[a[i]] оценивает к 9, в этом я немного запутался.

Я думал, что a[3] будет равен 1, а затем a[1] будет равен 8, однако, похоже, это не так. Может ли кто-нибудь внести ясность, поскольку курс Академии JetBrains не относится к этому.

Ответы

Ответ 1

Обратите внимание на первое условие - if (a[i] % 2 == 0) {a[i] += 1;} - это вызывает увеличение четных значений. Поэтому a[1] увеличивается с 8 до 9.

Теперь, когда i==3, a[a[i]] оценивается как a[1], что равно 9. Затем вы добавляете его к исходному значению a[3] (обратите внимание, что оператором является +=, а не =), поэтому a[3] становится 1 + 9, то есть 10.

Ответ 2

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

Я думал, что a[3] будет равно 1

Это правильно, на шаге 3, a[3] = 1

и тогда a[1] будет равен 8

Это не правильно, потому что на шаге 1 оно было увеличено до 9

Ответ 3

Все хорошо. Лучший способ увидеть, что вы делаете, - это debuggin (в данном случае рисование) ваш код:

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

И вы увидите более ясно. Иногда лучше самим стоять лицом к стене, потому что одна из лучших практик - это узнать о вас. Удачи!.