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

Поскольку массив двумерный, он представляет собой простую таблицу. Его также можно было создать следующим образом: int[][] array = new int[2][3];. Количество квадратных скобок указывает на размерность массива. А числа в скобках - на количество строк и столбцов. И также, используя индексы, мы можем использовать элементы массива в программе:
// установим элемент первого столбца второй строки
array[1][0]=44;
System.out.println(array[1][0]);
Объявление трехмерного массива могло бы выглядеть так:
int[][][] nums3 = new int[2][3][4];
Визуально трехмерный массив можно представить, как систему координат, содержащею оси: абсцисс, ординат и аппликат
Зубчатый массив
Многомерные массивы могут быть также представлены как «зубчатые массивы» или «неровные массивы». На рисунке выше двумерный массив имел 6 строк и 6 столбцов, поэтому у нас получалась ровная таблица. Но мы можем каждому элементу в двухмерном массиве присвоить отдельный массив с различным количеством элементов:
int[][] nums = new int[3][];
nums[0] = new int[2];
nums[1] = new int[3];
nums[2] = new int[5];
foreach
Специальная версия цикла for предназначена для перебора элементов в наборах элементов, например, в массивах и коллекциях. Она аналогична действию цикла foreach , который имеется в других языках программирования. Формальное объявление:
for (тип_данных название_переменной : контейнер){
// тело цикла
}
Например:
int[] array = new int[] { 1, 2, 3, 4, 5 };
for (int i : array){
System.out.println(i);
}
Особенность этой реализации в том, что элементы массива поочередно копируются в контейнер i. Поэтому изменение значения переменной i в теле цикла не изменит значений, хранящихся в массиве. Для изменения значений внутри массива, используется цикл с параметром for
Перебор многомерных массивов в цикле
int[][] array = new int[][]
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < array.length; i++){
for(int j=0; j < array[i].length; j++){
System.out.print(array[i][j] + "\t");
}
System.out.println();
}
Сначала создается цикл для перебора по строкам, а затем внутри первого цикла создается внутренний цикл для перебора по столбцам конкретной строки. Подобным образом можно перебрать трехмерные массивы и наборы с большим количеством размерностей
Приложение
Пример 1:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
/*int[][] array = {{6, 0, 1},
{7, 4, 2}};
System.out.println( array[1][2] );*/
Scanner in = new Scanner(System.in);
//Вводим n - кол-во строк и m - кол-во столбцов двумерного массива
int n = in.nextInt(), m = in.nextInt();
//Создаем двумерный массив n на m (NxM)
int[][] a = new int[n][m];
//Заполнение массива с клавиатуры
//Внешний цикл для передвижения по строкам
for (int i = 0; i < n; i++) {
//Внутренний цикл для движения по столбцам внутри строк
for (int j = 0; j < m; j++) {
//Чтение каждой клетки мссива с клавиатуры
a[i][j] = in.nextInt();
}
}
//Вывод на экран эл-тов двумерного массива в табличном виде
//Внешний цикл для передвижения по строкам
for (int i = 0; i < n; i++) {
//Внутренний цикл для движения по столбцам внутри строк
for (int j = 0; j < m; j++) {
//Вывод каждого эл-та строки через символ табуляции
System.out.print( a[i][j] + "\t");
}
//После того как выведена строка, переход на следующую
System.out.println();
}
}
}
Пример 2:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] array = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n ; j++) {
if (j == n - 1 - i){
array[i][j] = 1;
}
if ( j < n - 1 - i){
array[i][j] = 0;
}
if ( j > n - 1 - i){
array[i][j] = 2;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print( array[i][j] + " ");
}
System.out.println();
}
}
}