1. Двумерни масиви
Още един интересен факт за масивите. Масивите не са само едномерни (линейни). Могат да бъдат и двуизмерни.
Какво означава това, ще попитате?
Това означава, че клетките на масива могат да представляват не само колона (or ред), но и правоъгълна table.
int[][] name = new int[width][height];
Където име е името на променливата на масива, ширината е ширината на tableта (в клетки), а височината е височината на tableта. Пример:
|
Създаваме двуизмерен масив: 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} };
Има толкова много места, където вие като програмист може да се нуждаете от двуизмерен масив. Двуизмерните масиви са в основата на почти всяка настолна игра, например шах, дама, тик-так и морска битка:
Двуизмерните масиви са идеални за шах 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[0] съхранява препратка към първия ред. Разменяме референциите. В резултат на matrix това масивът изглежда така:
|
Ако препращате към клетка от двумерен масив, но указвате само един индекс след името на масива, тогава имате предвид контейнер от контейнери, чиито клетки съхраняват препратки към обикновени едномерни масиви.