- Многомерные массивы в Java
- 2. Создание многомерного массива
- 2.1. Сокращенная форма
- 2.2. Декларация, а затем инициализация
- 3. Представление памяти
- 4. Перебор элементов
- 5. Элементы печати
- 6. Длина элементов
- 7. Скопируйте двумерный массив
- 8. Заключение
- Многомерные массивы Java
- Как инициализировать двумерный массив Java?
- Как инициализировать многомерный массив Java?
Многомерные массивы в Java
Многомерный массив в 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])); > >
И в итоге мы получаем чистый и простой код. Сгенерированный вывод консоли будет выглядеть так:
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 .
Многомерные массивы Java
В Java можно объявить массив массивов, известный как многомерный массив. К примеру:
Здесь мы видим двухмерный массив Java , который может содержать до 12 элементов типа int :
Не забывайте, что индексирование в Java начинается с нуля, поэтому первые элементы массива имеют индекс 0 , а не 1 .
Аналогично можно объявить и трёхмерный ( 3D ) массив. Например:
String[][][] personalInfo = new String[3][4][2];
В примере выше personalInfo — это трёхмерный массив, в котором может быть до 24 (3*4*2) элементов типа String .
В Java составляющие многомерного массива — это тоже массивы. Если вы знаете C/C++ , то может показаться, что многомерные массивы в Java и C/C++ работают одинаково. Но это не совсем так — в Java ряды массивов могут быть разной длины. Разницу мы увидим во время инициализации.
Как инициализировать двумерный массив Java?
Ниже приводится пример инициализации двумерного массива Java :
Каждый компонент массива также представляет собой массив, и длина каждого ряда отличается:
Давайте напишем программу, чтобы это доказать:
class MultidimensionalArray < public static void main(String[] args) < int[][] a = < , , , >; System.out.println("Длина ряда 1: " + a[0].length); System.out.println("Длина ряда 2: " + a[1].length); System.out.println("Длина ряда 3: " + a[2].length); > >
При запуске этой программы мы получим:
Длина ряда 1: 3
Длина ряда 2: 4
Длина ряда 3: 1
Поскольку многомерный массив состоит из отдельных массивов (a[0], a[1] and a[2]) , можно использовать метод length для определения длины каждого ряда длины двумерного массива Java.
Пример: вывод на экран всех элементов двумерного массива с помощью циклов :
class MultidimensionalArray < public static void main(String[] args) < int[][] a = < , , , >; for (int i = 0; i < a.length; ++i) < for(int j = 0; j < a[i].length; ++j) < System.out.println(a[i][j]); >> > >
Всегда лучше использовать цикл for…each , когда нужно пройти по элементам массива. Пример сортировки двумерного массива Java можно записать с помощью цикла for…each следующим образом:
class MultidimensionalArray < public static void main(String[] args) < int[][] a = < , , , >; for (int[] innerArray: a) < for(int data: innerArray) < System.out.println(data); >> > >
При запуске этой программы мы получим следующий результат заполнения двумерного массива Java :
Как инициализировать многомерный массив Java?
Многомерный или трёхмерный массив инициализируется почти так же, как двухмерный:
// test — трёхмерный массив int[][][] test = < < , >, < , , > >;
Трёхмерный массив — это массив, состоящий из двумерных массивов. Как и у двумерных массивов Java , его ряды могут быть различной длины.
Пример: программа для вывода элементов трёхмерного массива с помощью циклов :
class ThreeArray < public static void main(String[] args) < // test – трёхмерный массив int[][][] test = < < , >, < , , > >; // цикл for..each проходит по элементам трёхмерного массива for (int[][] array2D: test) < for (int[] array1D: array2D) < for(int item: array1D) < System.out.println(item); >> > > >
При запуске программы вывода двумерного массива Java получаем следующий результат:
1 -2 3 2 3 4 -4 -5 6 9 1 2 3
МК Михаил Кузнецов автор-переводчик статьи «