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

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

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

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
  }
}

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

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


Коментарі (23)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Grimnir Рівень 19
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 вимірні об'єкти які змінюються в часі)