Кроме плоских массивов, 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
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.