— Привет, мой самый умный ученик!
— Здравствуй, Риша!
— Не скучал без новой темы о массивах? Сегодня у нас как раз одна такая! Сегодня я расскажу тебе о зубчатых и многомерных массивах.
— Звучит кровожадно и пугающе.
— Не волнуйся, настоящий программист всегда справится, если массив показывает ему свои зубы. А на самом деле “зубчатость” — это возможность не только поменять строки двумерного массива местами, но и сконструировать массив самому так, как ему нужно.
— Допустим, нужно, чтобы у первой строки двумерного массива была длина 10, а у второй — 50.
— А так можно?
— Вполне! Для начала создаём «контейнер контейнеров» – первый массив, который будет хранить ссылки на массивы-строки. Делается это так:
int[][] имя = new int[высота][];
— Ты просто не указываешь второй параметр, и Java-машина создает только «контейнер контейнеров». Вот что будет в памяти после выполнения этого кода:

— Ну а как создавать одномерные массивы, ты уже в курсе 🙂
Вот как будет выглядеть итоговый код:
|
Двумерный массив Нулевая строка — массив из 10 элементовПервая строка — массив из 50 элементов. |
— Только что мы создали так называемый «неровный» массив. Он же — «зубчатый», он же — «ступенчатый».
— И вот если мы захотим вывести все элементы этого массива на экран, нам очень пригодится свойство length
у массива: длины строк массива ведь разные.
— Кстати, можешь ответить, как узнать длину «контейнера контейнеров» в нашем примере? Это ведь тоже объект-массив, а значит, у него есть длина.
— Вероятно, matrix.length
?
— Совершенно верно! А у массивов-строк — как matrix[0].length
для нулевой строки.
— А для первой, получается, matrix[1].length
?
— Совершенно верно. И в первом случае результат вызова команды будет 10, а во втором — 50.
Работа с двумерным массивом
— Давай теперь попробуем вывести на экран двумерный массив:
|
Создание массива Заполнение массива значениями Внешний цикл по строкам массива — перебирает строки массива. Внутренний цикл по ячейкам — перебирает ячейки одной строки. |
— Как видишь, нужны два вложенных цикла. Первый мы называем внешним, а второй — внутренним.
— Во внешнем цикле (переменная i
) мы по очереди обходим все массивы-строки, из которых состоит наш двумерный массив. Каждое значение переменной i
соответствует строке массива с таким номером.
— Во внутреннем цикле (переменная j
) мы перебираем все ячейки массивов-строк. В результате работы внутреннего цикла на экран выведется строка, состоящая из значений одной строки массива.
— Вот что будет выведено на экран:
Обработана одна строка массива | 1 2 3 4 5 6 |
Обработаны две строки массива | 1 2 3 4 5 6 |
Обработаны три строки массива | 1 2 3 4 5 6 |
Многомерные массивы
— Амиго! Ты ведь уже успел догадаться, что если есть двумерные массивы, то могут быть и трёхмерные?
— Как раз об этом думал, но стеснялся спросить.
— Да, можно создать трёхмерный массив, и вообще, массив любой размерности. Такие массивы называют «многомерными». Давай ради интереса создадим многомерный массив размерности 4.
int[][][][] matrix = new int[2][3][4][5];
— Кажется, не очень сложно!
— Это ты пока не пробовал создавать его вручную! Вот, полюбуйся:
int[][][][] matrix;
matrix = new int[2][][][]; // создаем массив «ссылок на ссылки на ссылки» длины 2
for (int i = 0; i < matrix.length; i++)
{
matrix[i] = new int[3][][]; // создаем массив «ссылок на ссылки» длины 3
for (int j = 0; j < matrix[i].length; j++)
{
matrix[i][j] = new int[4][]; // создаем массив ссылок длины 4
for (int k = 0; k < matrix[i][j].length; k++)
matrix[i][j][k] = new int[5]; // создаем массивы целых чисел длины 5
}
}
— И это только создание массива! А ведь с ним еще и работать как-то нужно.
— Забираю свои слова обратно. Не так-то и просто с ними работать. Но можно.
— Раз можно, вот тебе бонусное задание. Напиши код, который выводит на экран все значения трехмерного массива. Знаний у тебя предостаточно. Главное — прояви терпение и внимательность. Или изобретательность (есть одно тайное знание, которое поможет решить эту задачку в одну строку). А лучше всего — реши и так, и так.
— Спасибо, Риша. Я попробую.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ