Шаг 15.
Язык программирования Java.
Многомерные массивы

На этом шаге мы рассмотрим многомерные массивы

Кроме одномерного массива, на практике часто используется многомерный массив. На этом шаге мы рассмотрим двумерные массивы. Двумерный массив - массив массивов. Двумерные массивы объявляются следующим образом:

 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

Предыдущий шаг Содержание Следующий шаг