JavaRush /Курсы /Java Syntax Pro /Зубчатые массивы в Java

Зубчатые массивы в Java

Java Syntax Pro
5 уровень , 5 лекция
Открыта

1. Неровные массивы

В Java вы как программист можете не только поменять строки двумерного массива местами, но и сконструировать этот массив самому так, как вам хочется.

Допустим, вы хотите, чтобы у первой строки двумерного массива была длина 10, а у второй — 50. Можно ли так сделать? Да, можно.

Для начала нужно создать «контейнер контейнеров» – первый массив, который будет хранить ссылки на массивы-строки. Делается это так:

int[][] имя = new int[высота][];

Вы просто не указываете второй параметр, и Java-машина создает только «контейнер контейнеров». Вот что будет в памяти после выполнения этого кода:

Зубчатые массивы в Java

Ну а как создавать одномерные массивы, вы уже знаете 🙂

Вот как будет выглядеть итоговый код:

// Важная матрица с данными
int[][] matrix = new int[2][];
matrix[0] = new int[10];
matrix[1] = new int[50];
Двумерный массив

Нулевая строка — массив из 10 элементов
Первая строка — массив из 50 элементов.

Только что вы создали так называемый «неровный массив».

И вот если мы захотим вывести все элементы этого массива на экран, нам очень пригодится свойство length у массива: длины строк массива ведь разные.

Кстати, как узнать длину «контейнера контейнеров» в нашем примере? Это ведь тоже объект-массив, а значит, у него есть длина. Правильный ответ — matrix.length.

А у массивов-строк как? matrix[0].length



2. Работа с двумерным массивом

Допустим, вы хотите вывести на экран двумерный массив. Как же это сделать?

Наш код будет выглядеть примерно так:

int[][] matrix = new int[3][];
matrix[0] = new int[]{1, 2, 3, 4, 5, 6};
matrix[1] = new int[]{1, 2, 3};
matrix[2] = new int[]{1};
for (int i = 0; i < matrix.length; i++) {
   for (int j = 0; j < matrix[i].length; j++)
      System.out.print( matrix[i][j] + " " );
   System.out.println();
}
Создание массива
Заполнение массива значениями


Внешний цикл по строкам массива — перебирает строки массива.
Внутренний цикл по ячейкам — перебирает ячейки одной строки.

Вам понадобится два вложенных цикла. Первый мы назовем внешним, а второй — внутренним.

Во внешнем цикле (переменная i) мы по очереди обходим все массивы-строки, из которых состоит наш двумерный массив. Каждое значение переменной i соответствует строке массива с таким номером.

Во внутреннем цикле (переменная j) мы перебираем все ячейки массивов-строк. В результате работы внутреннего цикла на экран выведется строка, состоящая из значений одной строки массива.

Вот что будет выведено на экран:

Обработана одна строка массива
1 2 3 4 5 6 
Обработаны две строки массива
1 2 3 4 5 6
1 2 3 
Обработаны три строки массива
1 2 3 4 5 6
1 2 3
1 


3. Многомерные массивы

И еще один интересный факт о массивах, о котором вы, наверное, уже догадываетесь. Если можно сделать двумерный массив, значит можно сделать и трехмерный?

Да, можно создать массив любой размерности. Такие массивы называют «многомерными».

Давайте ради интереса создадим многомерный массив размерности 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
  }
}

И это только создание массива! А ведь с ним еще и работать как-то нужно.

Бонусное задание — написать код, который выводит на экран все значения трехмерного массива.



Комментарии (619)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Игорь Лупац Уровень 21
16 января 2026
"Зубчатые массивы завертелись в башке..."
Анна Клушкина Уровень 11
5 января 2026
⛏ И снова интересные разборы задачек в комментариях
30 декабря 2025
Увлекательно)
d0vbnya Уровень 2
7 декабря 2025
Почему hard задачи, легче medium?)
Роман Зарубин Уровень 8
30 ноября 2025
Работаем
Alex Уровень 8
18 ноября 2025
Для зубчатого массива треугольника с введенным значением с консоли Scanner sc = new Scanner(System.in); int n = Integer.parseInt(sc.nextLine()); int[][] array = new int[n][]; for (int i = 0; i < array.length; i++) { array[i] = new int[i + 1]; } for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { array[i][j] = j + i; System.out.printf("%4d", array[i][j]); } System.out.println(); } System.out.println(Arrays.deepToString(array)); } }
Alex Уровень 8
18 ноября 2025
интересно, как в зубчатом массиве повторяющиеся значения сделать null......
Max Terentiev Уровень 7
18 октября 2025
Эх, треугольник получился, а по условию не прокатил)

public class Solution {

    public static int[][] result = new int[10][];

    public static void main(String[] args) {
        for (int i = 0; i < result.length; i++) {
            result[i] = new int[10];

            for (int j = 0; j < i+1; j++) {
                result[i][j] = i + j;
                System.out.print(" ");
                System.out.print(result[i][j]);
            }
            System.out.println();
        }
    }
}
Grigoryvvv Уровень 13 Expert
9 сентября 2025
Одномерный массив можно представить в виде последовательности элементов одного типа или строки. Двумерный массив проще представить в виде таблицы, у которой задано количество строк (первое измерение) и количество столбцов (второе измерение). Трехмерный массив [ ][ ][ ], где первый элемент можно представить в виде "слоя" из двумерного массива, или "листа" на котором напечатан двумерный массив, а ещё проще в виде "кол-ва" двумерных массивов.
Entropie Уровень 8
24 сентября 2025
Хорошая иллюстрация, которая объясняет что из себя представляют массивы с точки зрения логики. Но этого мало, нужно же еще и понимать, что такое ссылки, и что в 3-х мерном массиве будет mas[a] или mas[a][b] :)
Grigoryvvv Уровень 13 Expert
25 сентября 2025
Спасибо 👍 Этого мало, но хоть что-то ) Тоже выкладывайте по возможности информацию для будущих студентов. Будем помогать другим усваивать информацию быстрее и менять этот мир к лучшему )
Another Уровень 16
30 сентября 2025
Прикольные иллюстрации 👍 Но я бы скорректировал обозначение трёхмерного массива, следуя логике первого и второго изображения, таким образом: int[2, 3, 6]
Grigoryvvv Уровень 13 Expert
30 сентября 2025
Ну конечно, Вы совершенно правы. Спасибо за поправку ) На практике можно применить трёхмерный массив: - допустим к многоуровневой парковке в 5 этажей с размерами паркинга на каждом этаже 10 на 15 парковочных мест.

  int[][][] carPark = new int[5][10][15];
первым значением обозначим количество этажей, ну а второе и третье значение это обычный двумерный массив на каждом этаже. Каждый индекс массива можно заполнить булевыми значениями "true (истина)" занято, или "false (ложь)" не занято; - или допустим опишем "Кубик-рубик". У него 6 граней, на каждой грани двумерное поле размером 3 на 3.

  int[][][] rubiksCube = new int[6][3][3];
ну а каждый индекс "Кубик-рубика'' можно заполнить цифрами обозначающими цвет.
Игорь Лупац Уровень 21
4 сентября 2025

import java.util.Scanner;

/* 
Создаем двумерный массив
*/

public class Solution {
    public static int[][] multiArray;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        multiArray = new int[n][];
        
        for (int i = 0; i < n; i++) {
            int numsIn = sc.nextInt();
            
            for (int j = 0; j < numsIn; j++) {
                multiArray[i] = new int[numsIn];
            }
        }
    }
}

Horror Уровень 6
1 сентября 2025
знаете что? мусор на входе - мусор на выходе.. вот кто так условия пишет? короче, мой код работает, а там любитесь как хотите... public class Solution { public static int[][] multiArray; public static void main(String[] args) { //напишите тут ваш код Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); multiArray = new int[N][]; int[] string = new int[N]; for (int x = 0; x < N; x++) { string[x] = scanner.nextInt(); } for (int x = 0; x < N; x++) { multiArray[x] = new int[string[x]]; } } }
Игорь Лупац Уровень 21
4 сентября 2025
Скорее всего, там ожидается вложенный цикл. Возможно, по исполнении первого цикла оценивается результат - ага, не то, что нужно. А так - да, всё работает.
FosTeR Уровень 16
9 октября 2025
Тоже считанные числа в одномерный массив записал😁