Многомерные массивы в Java
1. обзор
Многомерный массив в Java - это массив, содержащий в качестве элементов массивы различных размеров. Его также называют «массивом массивов», «рваным массивом» или «зазубренным массивом».
В этом кратком руководстве мы более подробно рассмотрим определение многомерных массивов и работу с ними.
2. Создание многомерного массива
Давайте начнем с рассмотрения способов, которыми мы можем создать многомерный массив:
2.1. Сокращенная форма
Простой способ определить многомерный массив:
int[][] multiDimensionalArr = {{1, 2}, {3, 4, 5}, {6, 7, 8, 9}};
Здесь мы объявили и инициализировалиmultiDimensionalArr за один шаг.
2.2. Декларация, а затем инициализация
Мы начнем с объявления многомерного массива размера три:
int[][] multiDimensionalArr = new int[3][];
Здесьwe’ve omitted to specify the second dimension since it will vary.
Затем давайте пойдем дальше, объявив и инициализировав соответствующие элементы в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 - это длина массива с индексомouter вmultiDimensionalArr.
It helps us to ensure that we are looking for elements only within a valid range of each sub-array, тем самым избегая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. Скопируйте 2-мерный массив
Мы можем скопировать двумерный массив с помощью метода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. Заключение
В этой статье мы рассмотрели, что такое многомерные массивы, как они выглядят в памяти и как мы можем их определять и использовать.
Как всегда, исходный код представленных примеров можно найти вover on GitHub.