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:
|
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:
"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.:"
"É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:"
"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:"
|
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 matrix tömb így néz ki:
|
"É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."
GO TO FULL VERSION