Перейти к основному содержимому

Многомерные массивы в Java

· 4 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Обзор

Многомерный массив в Java — это массив, состоящий из массивов разного размера в качестве элементов. Его также называют «массивом массивов», «рваным массивом» или «зубчатым массивом».

В этом кратком руководстве мы более подробно рассмотрим определение многомерных массивов и работу с ними.

2. Создание многомерного массива

Давайте начнем с рассмотрения способов создания многомерного массива:

2.1. Сокращенная форма

Простой способ определить многомерный массив:

int[][] multiDimensionalArr = {{1, 2}, {3, 4, 5}, {6, 7, 8, 9}};

Здесь мы объявили и инициализировали multiDimensionalArr за один шаг.

2.2. Декларация, а затем инициализация

Начнем с объявления многомерного массива размера три:

int[][] multiDimensionalArr = new int[3][];

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

Далее, давайте пойдем дальше, объявив и инициализировав соответствующие элементы в multiDimensionalArr :

multiDimensionalArr[0] = new int[] {1, 2};
multiDimensionalArr[1] = new int[] {3, 4, 5};
multiDimensionalArr[2] = new int[] {6, 7, 8, 9};

Мы также можем просто объявить его элементы без их инициализации:

multiDimensionalArr[0] = new int[2];
multiDimensionalArr[1] = new int[3];
multiDimensionalArr[2] = new int[4];

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

Мы также можем использовать метод java.util.Arrays.fill для инициализации элементов массива:

void initialize2DArray(int[][] multiDimensionalArray) {
for (int[] array : multiDimensionalArray) {
Arrays.fill(array, 7);
}
}

Все элементы в массивах инициализируются одним и тем же значением.

3. Представление памяти

Как будет выглядеть представление в памяти нашего multiDimensionalArr ?

Как известно, массив в Java — это не что иное, как объект, элементами которого могут быть как примитивы, так и ссылки. Итак, двумерный массив в Java можно рассматривать как массив одномерных массивов.

Наш multiDimensionalArr в памяти будет выглядеть примерно так:

./be8491d20aad32b45624017ccf64ae74.png

Ясно, что multiDimensionalArr [0] содержит ссылку на одномерный массив размера 2, multiDimensionalArr[1] содержит ссылку на другой одномерный массив размера 3 и так далее.

Таким образом, Java позволяет нам определять и использовать многомерные массивы.

4. Перебор элементов

Мы можем перебирать многомерный массив так же, как любой другой массив в Java.

Давайте попробуем повторить и инициализировать элементы multiDimensionalArr , используя пользовательские данные:

void initializeElements(int[][] multiDimensionalArr) {
Scanner sc = new Scanner(System.in);
for (int outer = 0; outer < multiDimensionalArr.length; outer++) {
for (int inner = 0; inner < multiDimensionalArr[outer].length; inner++) {
multiDimensionalArr[outer][inner] = sc.nextInt();
}
}
}

Здесь multiDimensionalArr[outer].length — это длина массива по внешнему индексу в multiDimensionalArr .

Это помогает нам гарантировать, что мы ищем элементы только в допустимом диапазоне каждого подмассива , тем самым избегая исключения ArrayIndexOutOfBoundException .

5. Элементы печати

Что, если мы хотим напечатать элементы нашего многомерного массива?

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

Другой вариант, который у нас есть, — использовать вспомогательный метод java.util.Arrays.toString() :

void printElements(int[][] multiDimensionalArr) {
for (int index = 0; index < multiDimensionalArr.length; index++) {
System.out.println(Arrays.toString(multiDimensionalArr[index]));
}
}

И в итоге мы получаем чистый и простой код. Сгенерированный вывод консоли будет выглядеть так:

[1, 2] [3, 4, 5] [6, 7, 8, 9]

6. Длина элементов

Мы можем найти длину массивов в многомерном массиве, перебирая основной массив:

int[] findLengthOfElements(int[][] multiDimensionalArray) {
int[] arrayOfLengths = new int[multiDimensionalArray.length];
for (int i = 0; i < multiDimensionalArray.length; i++) {
arrayOfLengths[i] = multiDimensionalArray[i].length;
}
return arrayOfLengths;
}

Мы также можем найти длину массивов, используя потоки Java:

Integer[] findLengthOfArrays(int[][] multiDimensionalArray) {
return Arrays.stream(multiDimensionalArray)
.map(array -> array.length)
.toArray(Integer[]::new);
}

7. Скопируйте двумерный массив

Мы можем скопировать двумерный массив с помощью метода Arrays.copyOf :

int[][] copy2DArray(int[][] arrayOfArrays) {
int[][] copied2DArray = new int[arrayOfArrays.length][];
for (int i = 0; i < arrayOfArrays.length; i++) {
int[] array = arrayOfArrays[i];
copied2DArray[i] = Arrays.copyOf(array, array.length);
}
return copied2DArray;
}

Мы также можем добиться этого, используя потоки Java:

Integer[][] copy2DArray(Integer[][] arrayOfArrays) {
return Arrays.stream(arrayOfArrays)
.map(array -> Arrays.copyOf(array, array.length))
.toArray(Integer[][]::new);
}

8. Заключение

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

Как всегда, исходный код представленных примеров можно найти на GitHub .