1. Kétdimenziós tömbök

Még egy érdekesség a tömbökről. A tömbök nem csak egydimenziósak (lineárisak). Kétdimenziósak is lehetnek.

Mit jelent ez, kérdezed?

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

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. Példa:

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.
Írjon 5-öt az (1, 1) cellába.

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

Kétdimenziós tömbök

Mellesleg gyors inicializálást is használhat kétdimenziós tömbökhöz:

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

Olyan sok hely van, ahol programozóként szüksége lehet egy kétdimenziós tömbre. A kétdimenziós tömbök szinte minden társasjáték alapját képezik, pl. sakk, dáma, tic-tac-toe és tengeri csata:

Kétdimenziós tömbök 2

A kétdimenziós tömbök tökéletesek sakk- vagy tengeri csatákhoz. Csak a cellakoordinátákból álló számokra van szükségünk. Nem 'gyalog e2-e4', hanem 'gyalog (5,2) -> (5,4)'. Programozóként még könnyebb lesz.


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

Egyébként van itt egy érdekes dilemma:

Amikor tömböt hozunk létre a segítségével new int[2][5];, akkor van egy táblánk "két sor és 5 oszlop ", vagy ez "két oszlop és 5 sor "?" Más szóval, először a szélességet, majd a magasságot adjuk meg... vagy fordítva, először a magasság, majd a szélesség?Nos, ahogy szoktuk mondani, itt nem minden olyan egyszerű.

Kezdjük azzal a kérdéssel, hogy a tömb hogyan tárolódik a memóriában .

Természetesen a számítógép memóriájában valójában nincs mátrix: a memória minden helyének szekvenciális numerikus címe van: 0, 1, 2, ... Esetünkben 2 × 5-ös mátrixról beszélünk, de a memóriában. ez csak 10 egymást követő cella, semmi több. Semmi sem jelzi, hol vannak a sorok és az oszlopok.

Érv a "szélesség x magasság" mellett.

E megközelítés mellett az az érv, hogy mindenki matematikát tanul az iskolában, ahol megtanulják, hogy a koordinátapárokat „x”-ként (vagyis a vízszintes tengelyen), majd „y”-ként (a függőleges dimenzió) írják fel. És ez nem csak egy iskolai szabvány – ez egy általánosan elfogadott szabvány a matematikában. Ahogy mondani szokás, a matekkal nem lehet vitatkozni. így van? Először szélesség, majd magasság?

Érv a "magasság x szélesség" mellett.

Egy érdekes érv is felhozható ehhez az állásponthoz: a kétdimenziós tömbök gyors inicializálása. Valóban, ha inicializálni akarjuk a tömbünket, akkor a következő kódot írhatjuk:

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

Nem veszel észre semmit? Mi van, ha nálunk ez van?

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

Ha soronként beírjuk adatainkat a kódba, akkor egy 2 soros és 5 oszlopos mátrixot kapunk.

A lényeg

Mit mondhatunk? Ön dönti el, melyik a kényelmesebb az Ön számára. 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 gyors adatinicializáláson fog alapulni, azaz a szabványos 'magasság x szélesség' lesz.

Ha olyan szerencsés, hogy 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.


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

És most megtudhatja, hogyan vannak elrendezve a kétdimenziós tömbök. Kész?

A kétdimenziós tömbök valójában tömbök tömbjei!

Más szóval, ha egy közönséges tömb esetén egy tömbváltozó egy tömbelemeket tároló tárolóra való hivatkozást tárol, akkor a kétdimenziós tömbök esetében a helyzet egy kicsit robbanásszerű: egy kétdimenziós tömbváltozó tárol egy hivatkozás egy tárolóra, 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ömbváltozó, amely egy kétdimenziós tömb objektumra való hivatkozást tárol. Ban,-benközepén van egy kétdimenziós tömbobjektumunk, amelynek cellái egydimenziós tömböket tárolnak, amelyek 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. És ez a megközelítés számos előnnyel jár a Java programozónak:

Először is , mivel a „tárolók tárolója” hivatkozásokat tárol „sortömbökre”, nagyon gyorsan és egyszerűen cserélhetünk sorokat. A „tárolók tárolójának” megszerzéséhez csak egy indexet kell megadnia kettő helyett. Példa:

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

Ez a kód lehetővé teszi a sorok felcserélését:

// 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}
};

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 közönséges egydimenziós tömbökre utalnak.