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 това масивът изглежда така:
|
Ако препращате към клетка от двумерен масив, но указвате само един индекс след името на масива, тогава имате предвид контейнер от контейнери, чиито клетки съхраняват препратки към обикновени едномерни масиви.
GO TO FULL VERSION