JavaRush /Курси /Java Syntax Zero /Зубчасті масиви в Java

Зубчасті масиви в Java

Java Syntax Zero
Рівень 6 , Лекція 6
Відкрита

1. Нерівні масиви

У Java ви, як програміст, можете не лише поміняти рядки двовимірного масиву місцями, але й сконструювати цей масив самостійно як заманеться.

Припустімо ви хочете, щоб перший рядок двовимірного масиву мав довжину 10, а другий — 50. Чи можна так зробити? Так, можна.

Спершу потрібно створити «контейнер контейнерів» — перший масив, який зберігатиме посилання на масиви-рядки. Це роблять так:

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

Ви просто не вказуєте другий параметр, і 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
  }
}

І це лише створення масиву! А з ним ще й працювати якось треба.

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


Коментарі (23)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Grimnir Рівень 37
21 серпня 2025
Можна реалізувати в один рядок через deepToString
Alex Рівень 2
13 серпня 2024

for (int i = 0; i < 10; i++) {
            result[i] = new int[i + 1];

            for (int j = 0; j < i; j++) {
                result[i][j] = (i - 2) + (j + 1);
                System.out.print(' ');
                System.out.print(result[i][j]);
            }

            System.out.println();
        }
не викупаю чому не приймає навіть
hidden #3500645 Рівень 30
3 листопада 2024
1. У 4 рядку помилка - лічильник потрібно порівнювати з довжиною рядка

for (int j = 0; j < result[i].length; j++)
2. У 5 рядку помилка - нам потрібна сума індексів

result[i][j] = i + j;
3. Рядки 6 та 7 потрібно поміняти місцями Тоді все наче працюватиме коректно
Alex Рівень 2
13 січня 2025
урила мене
Artemiy Рівень 18
27 травня 2024
Мозок плавиться 😖
Feher Yana Рівень 23
4 квітня 2024
• Метод main(String[]) має зчитувати N+1 чисел з клавіатури. Це означає що ви повинні зчитати з консолі число N, а потім зчитати ще N-ну к-сть чисел. Тобто, N(к-сть чисел яку ви зчитуєте, після того, як дізнались це саме N) та +1(власне саме число N). Якщо int n = 3, то після нього ви зчитаєте ще 3 числа. Отак і виходить 3 числа(N) і n = 3(+1), всього зчитуєте 4 числа.
Ivan Kravets Рівень 22
11 грудня 2023
бісить коли код працює і дає правильний результат але не проходить валідацію. хард задача зробилася за три хвилини)))
Viacheslav B. Рівень 1
31 січня 2024
Ага, а ще інколи треба вірно зрозуміти умову, бо на приклад я досі не можу зрозуміти - "Метод main(String[]) має зчитувати N+1 чисел з клавіатури." Я так спершу і зробив – (sc.nextInt()+1), звісно валідацію не пройшов. )
Sava_crosava Рівень 23
9 вересня 2023
В останньому завданні краще дописати приклад виведення, чи вказати щоб виведення було в довільному вигляді) Більше часу пішло на роздуми як краще це вивести щоб було красиво ніж на написання коду)
Василь Рівень 4
11 липня 2023
що означає?:

Метод main(String[]) має зчитувати N+1 чисел з клавіатури.
Vitalii Рівень 11
2 серпня 2023
що в умові задачі помилка
Oleksandr Tkachenko Рівень 51
6 квітня 2023
я вибачаюсь, але валідація задач потребує суттєвого доопрацювання)
Bilan Maksym Рівень 43 Expert
15 березня 2023
Спочатку думав, що все забув, але хоч я і старий, але не скажу що зовсім складно.
Марк Рівень 8
22 лютого 2023
наведіть приклад використання багатовимірного массиву massiv[][][][]?
Oleksandr Tkachenko Рівень 51
6 квітня 2023
наприклад 3 вимірні об'єкти які змінюються в часі)