Előadásrészlet egy mentorral a Codegym University tanfolyam részeként. Jelentkezzen a teljes tanfolyamra.


– Üdvözlöm, Amigo!

– Szia, Rishi!

"Te már tudsz egy-két dolgot a tömbökről, sőt, remélem, sikerült is megoldanod néhány feladatot. De nem tudsz mindent. Például itt van egy másik érdekesség a tömbökről. A tömbök nem csak egydimenziósak (lineárisak). ). Lehetnek kétdimenziósak is."

– Hm... ez mit jelent?

"Ez azt jelenti, hogy a tömb cellái nem csak egy oszlopot (vagy sort), hanem egy téglalap alakú táblázatot is képviselhetnek.

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

"Ahol a név a tömbváltozó neve, a szélesség a táblázat szélessége (cellákban), a magasság pedig a táblázat magassága. Vessen egy pillantást egy példára:

int[][] data = new int[2][5];
data[1][1] = 5;
Létrehozunk egy kétdimenziós tömböt: 2 oszlopból és 5 sorból.
Az (1,1) cellába 5-öt írunk.

"Így fog kinézni a memóriában:

Kétdimenziós tömbök

"Mellesleg, kétdimenziós tömbök esetén gyors inicializálást is használhat:

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

"Hmm... ez most érdekes. Ha azt képzeljük, hogy az első belső zárójelben az egyik elem, a következő egy második... Tehát egy kétdimenziós tömb olyan, mint egy tömb tömbje?"

"Milyen okos tanuló vagy! Pontosan. Az első elem az egydimenziós tömb {31, 28, 31}, a második a {30, 31, 30}, és így tovább. De erre egy kicsit később ebben a leckében visszatérünk. Addig is próbáljon meg gondolkodni kétdimenziós tömb, mint táblázat sorokkal és oszlopokkal, amelyek mindegyik metszéspontjában cellákat képeznek.

– Erről van egy mentális képem. Egyébként mire használják ezeket a kétdimenziós tömböket?

"A programozóknak elég gyakran van szükségük kétdimenziós tömbökre. Ha alaposan megnézzük, szinte minden társasjátékot egy kész kétdimenziós tömb segítségével valósítanak meg: sakk, dáma, tic-tac-toe, tengeri csata stb.:"

tengeri csata

"Értem! A sakk vagy a tengeri csata játéktere tökéletesen illeszkedik a kétdimenziós tömbökhöz!"

"Igen, de a cella koordinátáiként számokat kell használni. Nem 'manu e2-e4', hanem 'pawn (5,2) -> (5,4)'. Programozóként még könnyebb lesz. "

Elemek elrendezése tömbökbe: (x, y) vagy (y, x)

"A kétdimenziós tömbök létrehozása érdekes dilemmát vet fel. Amikor tömböt hozunk létre a segítségével new int [2][5];, van egy "két sorból és 5 oszlopból álló " táblázatunk, vagy "két oszlop és 5 sor"?"

"Azaz nem teljesen világos, hogy először a szélességet, majd a "magasságot... vagy fordítva, először a magasságot, majd a szélességet adjuk meg?"

– Igen, ez a dilemma. És nincs határozott válasz.

"Mit kell tenni?"

"Először is fontos megérteni, hogy a kétdimenziós tömb valójában hogyan tárolódik a memóriában . Természetesen a számítógép memóriájában valójában nincsenek táblázatok: a memóriában minden helynek van egy szekvenciális numerikus címe: 0, 1, 2, ... Számunkra ez egy 2 × 5-ös táblázat, de a memóriában csak 10 cella, semmi több. Nincs sorokra és oszlopokra osztás."

"Megértettem. Akkor hogyan határozzuk meg, hogy melyik méret legyen előbb - a szélesség vagy a magasság?"

"Vegyük fontolóra az első lehetőséget. Először a szélesség, majd a magasság. "Az érv e megközelítés mellett a következő: mindenki matematikát tanul az iskolában, és megtanulja, hogy a koordinátapárokat 'x'-ként (vagyis vízszintes tengelyként) írják. majd „y” (a függőleges méret). És ez nem csak egy iskolai szabvány – ez egy általánosan elfogadott szabvány a matematikában. Ahogy mondani szokták, a matekkal nem lehet vitatkozni."

"Igaz? Nos, ha nem tudunk harcolni ellene, akkor először a szélesség, majd a magasság?"

"Van egy érdekes érv a "magasság először, aztán szélesség" mellett . Ez az érv a kétdimenziós tömbök gyors inicializálásából származik. Végül is, ha inicializálni akarjuk a tömbünket, akkor a következő kódot írjuk:"

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

– Akkor ez mit jelent nekünk?

"Észrevettél valamit? Mi van, ha nálunk van ez?

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

"Ha soronként beírjuk az adatainkat a kódba, akkor egy 2 soros és 5 oszlopos táblázatot kapunk."

"Most már értem. 2 a magasság, és 5 a szélesség... Akkor melyik opciót használjuk?"

"Te döntöd el, melyik a kényelmesebb. A legfontosabb dolog az, hogy minden programozó, aki ugyanazon a projekten dolgozik, ugyanazt a megközelítést alkalmazza."

"Ha olyan projekten dolgozol, amelynek kódja sok inicializált kétdimenziós tömböt tartalmaz, akkor valószínűleg minden a gyors adatinicializáláson fog alapulni, azaz a szabványos 'magasság x szélesség' lesz.

"Ha olyan projektben találja magát, amely sok matematikát magában foglal, és koordinátákkal dolgozik (például játékmotorok), akkor a kód valószínűleg a „szélesség x magasság” megközelítést alkalmazza.

Hogyan vannak elrendezve a kétdimenziós tömbök

– Emlékszel a kétdimenziós tömbök azon különleges tulajdonságára, amelyet a lecke elején észleltél?

"Igen! Az volt, hogy a kétdimenziós tömbök valójában tömbök!"

"Teljesen helyes. "Más szóval, ha egy közönséges tömb esetén egy tömbváltozó hivatkozást tárol egy tárolóra, amely tömbelemeket tárol, akkor a kétdimenziós tömbök esetében a helyzet egy kicsit robbanásszerű: egy kétdimenziós A -array változó egy olyan tárolóra mutató hivatkozást tárol, amely egydimenziós tömbök hivatkozásait tárolja. Jobb egyszer működés közben látni, mint százszor elmagyarázni:"

Hogyan vannak elrendezve a kétdimenziós tömbök

"A bal oldalon van egy kétdimenziós tömb változónk, amely egy kétdimenziós tömb objektumra való hivatkozást tárol. Középen van egy kétdimenziós tömbobjektum, amelynek cellái egydimenziós tömböket tárolnak, amelyek a egy kétdimenziós tömb sorai. A jobb oldalon pedig négy egydimenziós tömb látható – a mi kétdimenziós tömbünk sorai. A kétdimenziós tömbök valójában így működnek."

"Fantasztikus! De mit ad ez nekünk?"

"Mivel a "tárolók tárolója" a "sorok tömbjére" való hivatkozásokat tárolja, nagyon gyorsan és egyszerűen tudunk sorokat cserélni. Ahhoz, hogy "tárolók tárolóját" kapja, csak egy indexet kell megadnia kettő helyett. Példa:

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

"Nézze meg az alábbi kódot. Használhatjuk sorok felcserélésére:"

// 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;
A kétdimenziós tömb





matrix[0]az első sor hivatkozását tárolja.
Kicseréljük a referenciákat.

Ennek eredményeként a matrixtömb így néz ki:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

"Értem. Úgy működik, mintha bármelyik két közönséges tárgyat felcserélnénk."

Nos, ha egy kétdimenziós tömb cellájára hivatkozik, de csak egy indexet ad meg a tömb neve után, akkor olyan konténerekre gondol, amelyek cellái a közönséges tömbre utalnak. dimenziós tömbök."

"Minden logikusnak és világosnak tűnik. Köszönöm az előadást, Rishi!"

"Szívesen. Alkalmazza bölcsen a gyakorlatba."