Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Вложенные массивы Java: Массивы

Кроме плоских массивов, Java поддерживает вложенные массивы. С их помощью представляют табличные данные, по которым нужно выполнять какие-то вычисления. Например, почасовую разбивку температур за неделю можно представить в виде подобной таблицы. Дальше мы можем построить график, посчитать среднее и даже предсказать погоду.

Базовый синтаксис определения таких массивов:

import java.util.Arrays;

// Три строки и два столбца
// Количество [] определяет уровень вложенности
// В данном случае массив двухмерный (2D)
int[][] weather = {{14, 15}, {17, 18}, {13, 14}};

// Внутри первого уровня массивы
weather[0]; // [14, 15]
weather[1]; // [17, 18]
weather[2]; // [13, 14]

// Внутри второго уровня значения
weather[0][0]; // 14
weather[1][1]; // 18

// Для печати вложенных массивов deepToString()
System.out.println(Arrays.deepToString(weather));

https://replit.com/@hexlet/java-arrays-nested-arrays-multidimensional-array#Main.java

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

Чуть сложнее выглядит определение без инициализации:

// 3 строки и 2 столбца
int[][] weather = new int[3][2];

Вложенные массивы можно изменять напрямую, просто обратившись к нужному элементу:

// Наполняем как массив выше

// Первая строка
weather[0][0] = 14;
weather[0][1] = 15;

// Вторая строка
weather[1][0] = 17;
weather[1][1] = 18;

// Третья строка
weather[2][0] = 13;
weather[2][1] = 14;

https://replit.com/@hexlet/java-arrays-nested-arrays-access#Main.java

Вложенность никак не ограничивается. Можно создавать массив массивов массивов и так далее.

int[][][] nested = {{{ 1, 2}, {3, 4}}, {{ 5, 6}, {7, 8}}};

Пример использования

Для чего же могут понадобиться вложенные массивы? Таких примеров довольно много: начиная от математических концепций, например, матриц, заканчивая представлением игровых полей. Помните игру крестики-нолики? Это как раз тот самый случай:

Разберем такую задачку. Дано игровое поле для крестиков-ноликов. Нужно написать метод, который проверяет, есть ли на этом поле хотя бы один крестик или нолик, в зависимости от того, что попросят проверить.

// Инициализируем поле
// Значением по умолчанию - null
// Оно означает что в этой ячейке ничего нет
String[][] field = new String[3][3];

// Делаем ход
field[1][2] = "x";
// [
//     [null, null, null],
//     [null, null, "x"],
//     [null, null, null]
// ]

Теперь реализуем метод, который выполняет нужную проверку. В этом методе нам понадобится библиотека Apache Commons Lang и метод ArrayUtils.contains. Она содержит метод, проверяющий вхождение элемента в массив.

import org.apache.commons.lang3.ArrayUtils;

class TickTackToe {
    public static boolean didPlayerMove(String[][] field, String sym) {
        // Обходим поле. Каждый элемент — это строчка в игровом поле.
        for (var row : field) {
            // метод contains проверяет присутствует ли элемент в массиве
            if (ArrayUtils.contains(row, sym)) {
                // Если присутствует, значит мы нашли то, что искали.
                return true;
            }
        }

        // Если поле было просмотрено, но ничего не нашли,
        // значит ходов не было
        return false;
    }
}

Проверим:

TickTackToe.didPlayerMove(field, "x"); // true
TickTackToe.didPlayerMove(field, "o"); // false

https://replit.com/@hexlet/java-arrays-nested-arrays-tic-tac-toe#TickTackToe.java


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 28 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»