☕ Java

Двумерные массивы в Java 17: подробное руководство

Двумерные массивы в Java

Что такое двумерный массив?

Представь себе шахматную доску или таблицу в Excel. У каждой клетки есть две координаты: номер строки и номер столбца. Двумерный массив — это такая же таблица, только хранящая данные (числа, символы, строки).

Зачем это нужно? Например, чтобы хранить:

  • Схему зала кинотеатра (ряды и места)
  • Карту острова с сокровищами
  • Таблицу лайков у блогеров
  • Данные о товарах на складе

Простыми словами: это массив массивов. Сначала мы указываем строку, а внутри неё — столбцы.

Как объявить и создать двумерный массив?

Общий синтаксис:

тип_данных[][] имя_массива = new тип_данных[количество_строк][количество_столбцов];

Пример: создадим массив 3×2 (3 строки, 2 столбца) для хранения оценок:

int[][] оценки = new int[3][2];
// Заполним значениями
оценки[0][0] = 5;  // первая строка, первый столбец
оценки[0][1] = 4;  // первая строка, второй столбец
оценки[1][0] = 3;
оценки[1][1] = 5;
оценки[2][0] = 4;
оценки[2][1] = 4;

Можно создать и сразу заполнить:

int[][] числа = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

Обрати внимание: числа[0][0] = 1, числа[1][2] = 6, числа[2][1] = 8.

Ввод и вывод двумерного массива

Создадим программу, которая запрашивает размеры и заполняет массив с клавиатуры:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Введите количество строк: ");
        int строки = scanner.nextInt();
        System.out.print("Введите количество столбцов: ");
        int столбцы = scanner.nextInt();

        int[][] массив = new int[строки][столбцы];

        // Заполняем массив
        System.out.println("Введите элементы построчно:");
        for (int i = 0; i < строки; i++) {
            for (int j = 0; j < столбцы; j++) {
                массив[i][j] = scanner.nextInt();
            }
        }

        // Выводим массив в виде таблицы
        System.out.println("Ваш массив:");
        for (int i = 0; i < строки; i++) {
            for (int j = 0; j < столбцы; j++) {
                System.out.print(массив[i][j] + " ");
            }
            System.out.println(); // переход на новую строку
        }
    }
}

Пример работы программы:

Введите количество строк: 2
Введите количество столбцов: 3
Введите элементы построчно:
1 2 3
4 5 6
Ваш массив:
1 2 3 
4 5 6

Разбор типичной задачи: "Кинозал Уют"

В этой задаче нужно создать схему зала. У нас есть ряды (строки) и места (столбцы). Пусть свободные места обозначаются символом 'O', а занятые — 'X'.

import java.util.Scanner;

public class Cinema {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Введите количество рядов: ");
        int ряды = scanner.nextInt();
        System.out.print("Введите количество мест в ряду: ");
        int места = scanner.nextInt();

        char[][] зал = new char[ряды][места];

        // Заполняем все места как свободные
        for (int i = 0; i < ряды; i++) {
            for (int j = 0; j < места; j++) {
                зал[i][j] = 'O';
            }
        }

        // Выводим схему зала
        System.out.println("Схема зала:");
        for (int i = 0; i < ряды; i++) {
            for (int j = 0; j < места; j++) {
                System.out.print(зал[i][j] + " ");
            }
            System.out.println();
        }
    }
}

Пример работы:

Введите количество рядов: 3
Введите количество мест в ряду: 4
Схема зала:
O O O O 
O O O O 
O O O O

Ещё один пример: "Популярность постов"

У нас есть блогеры (строки) и их посты (столбцы). Нужно подсчитать общее количество лайков:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Количество блогеров: ");
        int блогеры = scanner.nextInt();
        System.out.print("Количество постов у каждого: ");
        int посты = scanner.nextInt();

        int[][] лайки = new int[блогеры][посты];

        // Вводим данные
        System.out.println("Введите количество лайков для каждого поста:");
        for (int i = 0; i < блогеры; i++) {
            System.out.println("Блогер " + (i+1) + ":");
            for (int j = 0; j < посты; j++) {
                лайки[i][j] = scanner.nextInt();
            }
        }

        // Считаем общее количество лайков
        int всего = 0;
        for (int i = 0; i < блогеры; i++) {
            for (int j = 0; j < посты; j++) {
                всего += лайки[i][j];
            }
        }

        System.out.println("Всего лайков: " + всего);
    }
}

Пример работы:

Количество блогеров: 2
Количество постов у каждого: 3
Введите количество лайков для каждого поста:
Блогер 1:
10 20 15
Блогер 2:
5 30 25
Всего лайков: 105

Частые ошибки новичков

  • Выход за границы массива: если массив размером 3×2, то индексы строк — от 0 до 2, столбцов — от 0 до 1. Обращение к массив[3][0] вызовет ошибку.
  • Путаница строк и столбцов: первый индекс — строка, второй — столбец. массив[строка][столбец].
  • Забыть вложенный цикл: для обхода всего массива нужно два цикла — один для строк, другой для столбцов внутри.
  • Неправильное объявление: int[][] arr = new int[][5]; — так нельзя, нужно указать количество строк.

Итоговый пример: "Карта острова Капитана Сильвера"

На карте символ 'S' — сокровище, '.' — пустое место. Найдём координаты сокровища:

import java.util.Scanner;

public class TreasureMap {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Введите размер карты (строки и столбцы): ");
        int строки = scanner.nextInt();
        int столбцы = scanner.nextInt();

        char[][] карта = new char[строки][столбцы];

        System.out.println("Введите карту построчно (S - сокровище, . - пусто):");
        for (int i = 0; i < строки; i++) {
            String строка = scanner.next();
            for (int j = 0; j < столбцы; j++) {
                карта[i][j] = строка.charAt(j);
            }
        }

        // Ищем сокровище
        boolean найдено = false;
        for (int i = 0; i < строки; i++) {
            for (int j = 0; j < столбцы; j++) {
                if (карта[i][j] == 'S') {
                    System.out.println("Сокровище найдено! Строка: " + (i+1) + ", Место: " + (j+1));
                    найдено = true;
                }
            }
        }

        if (!найдено) {
            System.out.println("Сокровище не найдено!");
        }
    }
}

Пример работы:

Введите размер карты (строки и столбцы): 3 3
Введите карту построчно (S - сокровище, . - пусто):
...
.S.
...
Сокровище найдено! Строка: 2, Место: 2

Коротко о главном

  • Двумерный массив — это таблица с рядами и столбцами.
  • Объявление: тип[][] имя = new тип[строки][столбцы];
  • Обращение к элементу: имя[строка][столбец]
  • Для обхода нужно два вложенных цикла.
  • Индексы начинаются с 0.

Попробуй решить задачи сам — это поможет закрепить тему!