В 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-й элемент со значением "#".