GrabDuck

Урок J-12. Многомерные массивы в Java. | Java для начинающих | Изучаем java ...

:

В уроке 10 мы научились создавать одномерные массивы. Подобным образом в Java можно создать двумерный, трехмерный, четырехмерный… иначе говоря, многомерные массивы. Многомерный массив в Java по сути является массивом из массивов.

Популярным примером использования такого рода массивов, являются матрицы, для представления которых, используются двумерные массивы.  Итак, что же такое матрица и как ее представить с помощью двумерного массива в Java.

Матрицы и двумерные массивы в Java

Матрица это прямоугольная таблица, состоящая из строк и столбцов  на  пересечении которых находятся её элементы. Количество строк и столбцов матрицы задают ее размер.

Общий вид матрицы размером x m — количество строк, n — количество столбцов), выглядит следующим образом:

image004

Каждый элемент матрицы имеет свой индекс, где первая цифра обозначает номер строки на которой находится элемент, а вторая — номер столбца.

Рассмотрим примеры конкретных матриц и создадим их с помощью Java.

06_clip_image020

Матрица A имеет размерность 2 на 3 (2 строки, 3 столбца). Создадим двухмерный массив этой размерности:

int[][] matrixA;
matrixA = new int[2][3];

Мы объявили двумерный массив целых чисел (поскольку матрица в данном случае содержит целые числа) и зарезервировали для него память. Для этого мы использовали 2 индекса: первый индекс определяет строку и ее размер, второй индекс определяет столбец и его размер.

Далее будем инициализировать массив поэлементно. Запишем матрицу A в виде таблицы, чтобы было визуально понятно, какому индексу соответствует элемент.

MatrA

Для доступа к элементам двумерного массива необходимо использовать 2 индекса: первый для строки, второй – для столбца. Как и в случае с одномерными массивами, индексы также начинаются с нуля. Поэтому нумерация строк и столбцов в таблице начинается с 0.

matrixA[0][0] = 1;
matrixA[0][1] = -2;
matrixA[0][2] = 3;
matrixA[1][0] = 4;
matrixA[1][1] = 1;
matrixA[1][2] = 7;

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

for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        System.out.print(matrixA[i][j] + "\t");
    }
    System.out.println();
}

То есть, сначала выводим все элементы первой строки, отделяя их символом табуляции "\t",  переносим строку и выводим все элементы второй строки.

Полностью код для матрицы А выглядит следующим образом:

public class Matrix {

	public static void main(String[] args) {

		int[][] matrixA;
		matrixA = new int[2][3];
		
		matrixA[0][0] = 1;
		matrixA[0][1] = -2;
		matrixA[0][2] = 3;
		matrixA[1][0] = 4;
		matrixA[1][1] = 1;
		matrixA[1][2] = 7;		

		for (int i = 0; i < 2; i++) {
                    for (int j = 0; j < 3; j++) {
            	        System.out.print(matrixA[i][j] + "\t");
                    }
                    System.out.println();
                }
	}
}

Для матрицы B воспользуемся упрощенным способом инициализации — в момент объявления. По аналогии с одномерными массивами.

int[][] matrixB = {
	{-9,1,0},
	{4,1,1},
	{-2,2,-1}
};

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

Полностью код для матрицы B:

public class Matrix {

	public static void main(String[] args) {

		int[][] matrixB = {
			{-9,1,0},
			{4,1,1},
			{-2,2,-1}
		};		

		for (int i = 0; i < 3; i++) {
                    for (int j = 0; j < 3; j++) {
            	        System.out.print(matrixB[i][j] + "\t");
                    }
                    System.out.println();
                }
	}
}

Рассмотрим инициализацию в цикле для двумерного массива на примере таблицы умножения.

public class Mult {

	public static void main(String[] args) {
                // создаем двумерный массив 10 на 10
		int[][] multiplyTab  = new int[10][10];
                
                // цикл по первой размерности
		for (int i = 0; i < 10; i++) {
                    // цикл по второй размерности
                    for (int j = 0; j < 10; j++) {
                        //инициализация элементов массива
            	        multiplyTab[i][j] = (i+1)*(j+1); 

                        //вывод элементов массива 
         	        System.out.print(multiplyTab[i][j] + "\t");
                    }
                    System.out.println();
                }
	}
}

Здесь инициализация элементов значениями таблицы умножения совмещена с их выводом на консоль в одном цикле.

 

Многомерные и несимметричные массивы.

Создаются многомерные массивы в Java аналогичным способом. Количество квадратных скобок указывает на размерность.
Примеры создания массивов фиксированной длины:

int[][] a = new int[5][5];// двумерный массив
int[][][] b = new int[3][4][5];// трехмерный массив
int[][][][] c = new int[2][4][5][5];// четырехмерный массив
// и т.д.

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

int[][] a1 = new int[5][];// двумерный массив с 5 строками

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

a1[0] = new int [1];
a1[1] = new int [2];
a1[2] = new int [3];
a1[3] = new int [4];
a1[4] = new int [5];

В результате, при выводе на экран,

for(int i = 0; i<a1.length; i++){
	for(int j = 0; j<a1[i].length; j++){			
	    System.out.print(a1[i][j] + " ");
	}
	System.out.println();
}

массив будет иметь такой вид:

0
0 0
0 0 0
0 0 0 0
0 0 0 0 0

При создании массива его элементы автоматически инициализируются нулями, поэтому в это примере на экран выведены нули.

 

Упражнения на тему многомерные массивы в Java:

  1.  Создайте массив размерностью 5 на 6 и заполните его случайными числами (в диапазоне от 0 до 99 ).  Выведите на консоль третью строку
  2. Даны матрицы С и D размерностью 3 на 3 и заполненные случайными числами в диапазоне  от 0 до 99. Выполните по отдельности сначала сложение, потом умножения матриц друг на друга. Выведете исходные матрицы и результат вычислений на консоль.
  3. Просуммируйте все элементы двумерного массива.
  4. Дан двумерный массив, содержащий отрицательные и положительные числа. Выведете на экран номера тех ячеек массива, которые содержат отрицательные числа.
  5. Отсортируйте элементы в строках двумерного массива по возрастанию