JavaRush /Курси /JAVA 25 SELF /Двовимірні масиви

Двовимірні масиви

JAVA 25 SELF
Рівень 7 , Лекція 3
Відкрита

1. Вступ

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

А тепер уявіть собі розклад робіт або шахову дошку. Там усе організовано у рядки й стовпці — тобто в таблицю. Це якраз типова задача для двовимірного масиву.

У реальному житті двовимірні масиви трапляються дуже часто:

  • Таблиці із зарплатами працівників (рядки — працівники, стовпці — місяці).
  • Зображення на екрані (кожна «клітинка» має колір пікселя і дві координати: X і Y).
  • Матричні обчислення та обробка даних.
  • Шахова дошка або поле для «хрестиків‑нуликів».

Іноді двовимірний масив називають матрицею (ця назва походить із математики).

Є багато випадків, коли вам, як програмісту, може знадобитися двовимірний масив. Реалізація майже будь‑якої настільної гри зазвичай спирається на двовимірний масив: «шахи», «шашки», «хрестики‑нулики», «морський бій».

Двовимірні масиви 2

Ігрове поле «шахів» чи «морського бою» ідеально лягає на двовимірні масиви, де координати клітинок задаються числами. Не «пішак e2 ⟶ e4», а «пішак (4,1) ⟶ (4,3)». Для вас, як програміста, це зазвичай простіше реалізувати й опрацювати.

2. Синтаксис оголошення двовимірних масивів

Не лякайтеся — розберемося крок за кроком.

Загальне правило


тип[][] ім'яМасиву;
Оголошення двовимірного масиву в Java

Пара порожніх [] дужок — не помилка, а вказівка на те, що масив двовимірний.

Приклади

int[][] matrix;
double[][] gradesTable;
string[][] chessBoard;

Створення масиву

Задаємо розміри: кількість рядків і стовпців.

matrix = new int[3][4]; // 3 рядки, 4 стовпці

Це таблиця 3×4: на кшталт таблиці в Excel з трьома рядками та чотирма стовпцями.

Можна одразу оголосити змінну й створити двовимірний масив:

int[][] matrix = new int[3][4];

Можна ініціалізувати одразу значеннями (аналогічно до одномірного масиву):

int[][] example = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
// Таблиця: 3 рядки, 3 стовпці
Ініціалізація двовимірного масиву значеннями

Візуальна схема

┌─────┬─────┬─────┬─────┐
│  0  │  1  │  2  │  3  │  ← стовпці (columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │ 0,1 │ 0,2 │ 0,3 │  ← рядок 0 (row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │ 1,1 │ 1,2 │ 1,3 │  ← рядок 1 (row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │ 2,1 │ 2,2 │ 2,3 │  ← рядок 2 (row 2)
└─────┴─────┴─────┴─────┘

Кожен елемент задається парою індексів [рядок, стовпець].

3. Індексація та доступ до елементів

У двовимірному масиві для доступу до елемента вказуються два індекси:

  • Перший — номер рядка.
  • Другий — номер стовпця.

      // У другому рядку (індекс 1), у третьому стовпці (індекс 2)
      matrix[1][2] = 99;
Присвоєння значення елементу двовимірного масиву

Якщо ви звикли до шахів, зверніть увагу: індексація починається з нуля. Тобто перший елемент — це [0][0].

Запис і читання

int[][] data = new int[5][2];
data[1][1] = 5;         // запис
int value = data[1][1]; // читання

Ось як це виглядає у памʼяті:

Двовимірні масиви

4. Заповнення двовимірного масиву

Напишімо код, який заповнить матрицю послідовними числами від 1 до 12, щоб було зрозуміло, як це працює.

int[][] matrix = new int[3][4];
int value = 1;

for (int row = 0; row < 3; row++)
{
    for (int col = 0; col < 4; col++)
    {
        matrix[row][col] = value;
        value++;
    }
}
Послідовне заповнення двовимірного масиву числами

Ілюстрація:

Після виконання:
┌────┬────┬────┬────┐
│ 1  │ 2  │ 3  │ 4  │
├────┼────┼────┼────┤
│ 5  │ 6  │ 7  │ 8  │
├────┼────┼────┼────┤
│ 9  │ 10 │ 11 │ 12 │
└────┴────┴────┴────┘

5. Будова двовимірних масивів

Зараз ви дізнаєтеся, як насправді влаштовані двовимірні масиви.

Насправді двовимірні масиви — це масиви одномірних масивів.

Інакше кажучи, у випадку звичайного масиву змінна зберігає посилання на контейнер з елементами. А у разі двовимірного — змінна посилається на обʼєкт, у клітинках якого зберігаються посилання на одномірні масиви (рядки). Краще один раз побачити, ніж довго описувати:

Будова двовимірних масивів

Ліворуч — змінна, що посилається на обʼєкт двовимірного масиву. Посередині — сам обʼєкт двовимірного масиву, у клітинках якого зберігаються посилання на одномірні масиви — рядки. А праворуч — кілька одномірних масивів, тобто рядки нашого двовимірного масиву.

Такий підхід дає Java‑програмісту кілька переваг:

По‑перше, оскільки «контейнер контейнерів» зберігає посилання на масиви‑рядки, ми можемо дуже швидко й просто міняти рядки місцями. Щоб отримати доступ до рядка, достатньо вказати один індекс замість двох. Приклад:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

За допомогою такого коду можна поміняти рядки місцями:

// Важлива матриця даних
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;

Якщо ви звернетеся до двовимірного масиву, вказавши лише один індекс після його імені, то отримаєте посилання на одномірний масив — рядок двовимірного масиву.

6. Виведення двовимірного масиву на екран

Щоб вивести двовимірну таблицю, зазвичай використовують подвійний цикл — це схоже на «малювання» лабіринту у консолі. Приклад:

for (int row = 0; row < matrix.length; row++) 
{
    for (int col = 0; col < matrix[row].length; col++) 
    {
        System.out.print(matrix[row][col] + "\t"); 
    }
    System.out.println(); // перехід на новий рядок
}

Приклад виведення:

1	2	3	4	
5	6	7	8	
9	10	11	12	

До речі, тепер ви вмієте красиво «малювати» таблиці за допомогою кількох рядків коду!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ