«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 в памяти будет выглядеть примерно так:

Ясно, что 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.