1. Двумерни масиви

Още един интересен факт за масивите. Масивите не са само едномерни (линейни). Могат да бъдат и двуизмерни.

Какво означава това, ще попитате?

Това означава, че клетките на масива могат да представляват не само колона (or ред), но и правоъгълна table.

int[][] name = new int[width][height];

Където име е името на променливата на масива, ширината е ширината на tableта (в клетки), а височината е височината на tableта. Пример:

int[][] data = new int[2][5];
data[1][1] = 5;
Създаваме двуизмерен масив: 2 колони и 5 реда.
Напишете 5 в клетка (1, 1).

Ето How ще изглежда в паметта:

Двумерни масиви

Между другото, можете също да използвате бърза инициализация за двумерни масиви:

// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

Има толкова много места, където вие като програмист може да се нуждаете от двуизмерен масив. Двуизмерните масиви са в основата на почти всяка настолна игра, например шах, дама, тик-так и морска битка:

Двумерни масиви 2

Двуизмерните масиви са идеални за шах or морска битка. Трябват ни само числа от координатите на клетките. Не „пешка e2-e4“, а „пешка (5,2) -> (5,4)“. Ще ви е още по-лесно като програмист.


2. Подреждане на елементи в масиви: (x, y) or (y, x)

Между другото, тук има една интересна дилема:

Когато създаваме масив с помощта на new int[2][5];, имаме ли table с „два реда и 5 колони “ or е „две колони и 5 реда “?" С други думи, първо определяме ширината и след това височината... or обратно, първо височината, а след това ширината?Е, Howто често казваме, тук всичко не е толкова просто.

Нека започнем с въпроса How масивът се съхранява в паметта .

Разбира се, компютърната памет всъщност няма матрица в себе си: всяко място в паметта има последователен цифров address: 0, 1, 2, ... В нашия случай говорим за матрица 2 × 5, но в паметта това са само 10 последователни клетки, нищо повече. Нищо не показва къде са редовете и колоните.

Аргумент в полза на "ширина х височина".

Аргументът в полза на този подход е, че всеки учи математика в учorще, където научава, че координатните двойки се записват като 'x' (тоест хоризонталната ос) и след това 'y' (вертикалното измерение). И това не е просто учorщен стандарт - това е общоприет стандарт по математика. Както се казва, не можете да спорите с математиката. Дали е така? Първо ширина и после височина?

Аргумент в полза на "височина x ширина".

Има и интересен аргумент за тази позиция: бърза инициализация на двумерни масиви. Наистина, ако искаме да инициализираме нашия масив, тогава можем да напишем code по следния начин:

// Matrix of important data
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

Нищо ли не забелязвате? Ами ако имаме това?

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

Ако запишем нашите данни в codeа ред по ред, тогава получаваме матрица с 2 реда и 5 колони.

Долен ред

Howво можем да кажем От вас зависи да решите кое е по-удобно за вас. Най-важното е всички програмисти, работещи по един и същ проект, да се придържат към един и същ подход.

Ако работите върху проект, чийто code има много инициализирани двумерни масиви, тогава най-вероятно всичко там ще се основава на бърза инициализация на данни, т.е. ще имате стандартната "височина x ширина".

Ако имате достатъчно късмет да попаднете в проект, включващ много математика и работа с координати (например двигатели за игри), тогава codeът най-вероятно ще приеме подхода „ширина x височина“.


3. Как се подреждат двумерните масиви

А сега ще научите How всъщност са подредени двумерните масиви. Готов?

Двумерните масиви всъщност са масиви от масиви!

С други думи, ако в случай на обикновен масив, променливата на масива съхранява препратка към контейнер, който съхранява елементи на масив, тогава в случая на двумерни масиви ситуацията се взривява малко: променливата на двумерен масив съхранява препратка към контейнер, който съхранява препратки към едномерни масиви. По-добре е да го видите в действие веднъж, instead of да се опитвате да го обяснявате сто пъти:

Как са подредени двумерните масиви

Отляво имаме променлива за двуизмерен масив, която съхранява препратка към обект с двуизмерен масив . Вв средата имаме обект с двумерен масив, чиито клетки съхраняват едномерни масиви, които са редовете на двумерен масив. А отдясно можете да видите четири едномерни масива — редовете на нашия двумерен масив.

Ето How всъщност работят двумерните масиви. И този подход дава на Java програмиста няколко предимства:

Първо , тъй като „контейнер от контейнери“ съхранява препратки към „масиви от редове“, можем много бързо и лесно да разменяме редове. За да получите „контейнер от контейнери“, просто трябва да посочите един индекс instead of два. Пример:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

Този code ви позволява да разменяте редове:

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
Двумерният масив





matrix[0]съхранява препратка към първия ред.
Разменяме референциите.

В резултат на matrixтова масивът изглежда така:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

Ако препращате към клетка от двумерен масив, но указвате само един индекс след името на масива, тогава имате предвид контейнер от контейнери, чиито клетки съхраняват препратки към обикновени едномерни масиви.