Многомерни масиви в 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][];

Тук пропуснахме да посочим второто измерение, тъй като то ще варира .

След това нека отидем по-нататък, като декларираме и инициализираме съответните елементи в 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 [external] .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. Копирайте 2-D масив

Можем да копираме 2-D масив, използвайки метода 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.