На этом шаге мы рассмотрим многомерные массивы
Кроме одномерного массива, на практике часто используется многомерный массив. На этом шаге мы рассмотрим двумерные массивы. Двумерный массив - массив массивов. Двумерные массивы объявляются следующим образом:
double[][] x;
Создать массив, т.е. выделить под него место в памяти можно с помощью той же операции new:
x = new double[5][6];
В данном примере создается матрица 5х6. В думерном массиве, как и в одномерном, номерация элементов начинается с нуля. Например, элемент, стоящий в 2 строке и в 3 столбце, будет равен x[1][2].
Представление двумерного массива в Java отличается от представления двумерного массива в C++. Рассмотрим пример. Пусть у нас есть следующий фрагмент кода:
int[][] a = new int[3][4]; a[0][0] = 1; a[0][1] = 2; a[0][2] = 3; a[0][3] = 4; a[1][0] = 5; a[1][1] = 6; a[1][2] = 7; a[1][3] = 8; a[2][0] = 9; a[2][1] = 10; a[2][2] = 11; a[2][3] = 12;
Двумерные массивы в C++ хранятся ввиде линейного непрерывного участка памяти (см. рисунок 1). В Java двумерный массив представляется следующим образом: выделяется массив размера 3, элементами которого будут целые значения - сылки на массивы размера 4 (см. рисунок 2).
Рис. 1. Представление двумерного массива в C++
Рис. 2. Представление двумерного массива в Java
Такое представление в памяти дает возможность использование неровных массивов, т.е. двумерных массивов, длина которых различная. Ниже приведем пример создание неровного массива.
int[][] a = new int[5][]; for (int i = 0; i < 5; i++) { a[i] = new int[i + 1]; }
В данном примере создается треугольная матрица. В первой строке массив из 1 элемента. В последней строке - массив из 5 элементов.
Приведем ниже примеры использования двумерных массивов.
Пример 1. Создать произвольную матрицу 10х10. Посчитать сумму элементов всей матрицы.
public class PrimerFirst { public static void main(String[] args) { /*Объявление и создание массива 10х10*/ int[][] a = new int[10][10]; /*Заполнение массива произвольными числами из [0;99]*/ for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { a[i][j] = (int) (Math.random() * 100); } } /*Подсчет суммы элементов*/ int sum = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { sum += a[i][j]; } } /*Вывод содержимого массива на экран*/ System.out.println("Array"); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.print(a[i][j] + " "); } System.out.println(); } /*Вывод суммы элементов на экран*/ System.out.println("summa: " + sum); } }
Проект можно взять здесь.
Рис. 1. Вывод программы
Пример 2. Посчитать треугольник Паскаля.
public class PrimerSecond { public static void main(String[] args) { /*Создаем неровный массив*/ int[][] a = new int[11][]; for (int i = 0; i < 11; i++) { a[i] = new int[i + 1]; /*Заполняем массив по определению треугольника Паскаля*/ a[i][0] = a[i][i] = 1; for (int j = 1; j < i; j++) { a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; } } /*Вывод неровного массива на экран*/ System.out.println("Pascal's Triangle"); for (int i = 0; i < 11; i++) { for (int j = 0; j < i + 1; j++) { System.out.print(a[i][j] + " "); } System.out.println(); } } }
Проект можно взять здесь.
Рис. 2. Вывод программы
На следующем шаге мы рассмотрим цикл в стиле for each