В Java: использование циклов foreach в конструкторах для инициализации полей данных многомерного массива

Поэтому я пытаюсь создать класс, который инкапсулирует двумерный массив символов. В частности, я хочу определить конструктор по умолчанию, чтобы инкапсулированный 2D-массив содержал символ по умолчанию (в данном случае '#'). Моя проблема: когда я пытаюсь систематически заполнять массив символом по умолчанию через вложенные циклы foreach, компилятор не признает, что я использую инициализированный параметр char второго вложенного цикла c, хотя, очевидно, я использую присваивание c = '# ". Процитируем Eclipse: "Значение локальной переменной c не используется".

Вот соответствующий код:

public class 2DCharArr
{
 private char[][] chars;
 private byte length_x, length_y;

 public 2DCharArr()
 {
  length_x = 10; length_y = 10;
  chars = new char[length_x][length_y];
  for (char[] arr : chars)
   for (char c : arr)
    c = '#'; // Does not signal to Eclipse that c was used.
 }
}

Что-то не так с моим синтаксисом в циклах foreach, так что компилятор не может подтвердить мое использование c? Было бы здорово, если бы кто-то прояснил это для меня, так как это мешает мне использовать циклы foreach для создания объектов, содержащих многомерные массивы, хотя я чувствую, что смогу, если когда-нибудь стану очень компетентным с языком. Заранее спасибо за понимание!

2 ответа

Решение

Вы не можете назначать значения при использовании расширенного оператора for. Вам придется перебирать их обычным способом и присваивать значения конкретным индексам.

for(int i= 0; i < chars.length; i++) {
    for(int j = 0; j < chars[i].length; j++) {
        chars[i][j] = '#';
    }
}

Причиной этого является нюанс в том, что расширенный для определяется в JLS:

  • Если это Iterable, он использует свой итератор с результатом next() привязан к вашей переменной.
  • Если это тип массива, он создает цикл for со значением индекса, привязанным к переменной.

В любом случае вы не можете изменить передаваемую переменную для какого-либо значимого эффекта, такого как присвоение значений.

Вы путаете использование назначений:

int x = 5;
int y = x;
y = 6;

не изменит значение х. Ваш внутренний цикл по сути "говорит":

char c = arr[current index];
c = '#';

Это не изменит значение arr[current index], это просто изменит значение c на "#", но оставьте оригинал arr массив без изменений. Компилятор предупреждает вас, что переменная, которую вы создаете c никогда не используется (то есть никогда не читается).

Обратите внимание, что этот цикл будет работать нормально:

for (char[] arr : chars)
    for (int x = 0; x < arr.length; x++)
        arr[x] = '#';

Внешний цикл foreach назначает arr переменная для указания на текущий char[] объект внутри chars, затем arr[x] присваивает x-й элемент со значением "#".

Другие вопросы по тегам