Et foredragsuddrag med en mentor som en del af Codegym University-kurset. Tilmeld dig hele kurset.


"Hilsen, Amigo!"

"Hej, Rishi!"

"Du ved allerede en ting eller to om arrays, og det er endda lykkedes dig at løse nogle opgaver, håber jeg. Men du ved ikke alt. For eksempel er her en anden interessant kendsgerning om arrays. Arrays er ikke kun endimensionelle (lineære) ). De kan også være todimensionelle."

"Øh... Hvad betyder det?"

"Det betyder, at cellerne i arrayet ikke kun kan repræsentere en kolonne (eller række), men også en rektangulær tabel.

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

"Hvor navn er navnet på matrixvariablen, bredde er tabelbredden (i celler), og højde er tabelhøjden. Tag et kig på et eksempel:

int[][] data = new int[2][5];
data[1][1] = 5;
Vi opretter et todimensionelt array: 2 kolonner og 5 rækker.
Vi skriver 5 i celle (1,1).

"Sådan vil det se ud i hukommelsen:

Todimensionelle arrays

"Forresten, til todimensionelle arrays kan du også bruge hurtig initialisering:

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

"Hmm... nu er det interessant. Hvis vi forestiller os, at i de første indre parenteser repræsenterer et element, er det næste et andet... Så en todimensional matrix er ligesom en matrix af matrixer?"

"Sikke en klog elev du er! Præcis. Det første element er det endimensionelle array {31, 28, 31}, det andet er {30, 31, 30}, og så videre. Men det vender vi tilbage til lidt senere i denne lektion. Indtil da, prøv at tænke på en todimensionel matrix som en tabel med rækker og kolonner, der danner celler ved hvert skæringspunkt.

"Jeg har et mentalt billede af det. Forresten, hvad bruges de til, disse todimensionelle arrays?"

"Programmer har ret ofte brug for todimensionelle arrays. Hvis du ser godt efter, implementeres næsten ethvert brætspil ved hjælp af et todimensionelt array, der er klar til brug: skak, dam, tic-tac-toe, søslag osv.:"

søslag

"Jeg forstår det! Spillepladsen for skak eller søkamp passer perfekt til todimensionelle arrays!"

"Ja, men du skal bruge tal som cellekoordinaterne. Ikke 'bonde e2-e4', men 'bonde (5,2) -> (5,4)'. Det bliver endnu nemmere for dig som programmør. "

Arrangering af elementer i arrays: (x, y) eller (y, x)

"Oprettelse af todimensionelle arrays rejser et interessant dilemma. Når vi opretter et array ved hjælp af new int [2][5];, har vi en tabel med 'to rækker og 5 kolonner ' eller er det 'to kolonner og 5 rækker'?"

"Med andre ord er det ikke helt klart, om vi først angiver bredden og derefter 'højden... eller omvendt, først højden og derefter bredden?"

"Ja, dette er dilemmaet. Og der er ikke noget entydigt svar."

"Hvad skal man gøre?"

"For det første er det vigtigt at forstå, hvordan vores todimensionelle array faktisk er lagret i hukommelsen . Naturligvis har computerhukommelsen faktisk ingen tabeller i sig: hver placering i hukommelsen har en sekventiel numerisk adresse: 0, 1, 2, ... For os er dette en 2 × 5 tabel, men i hukommelsen er det kun 10 celler, intet mere. Ingen opdeling i rækker og kolonner."

"Jeg forstod det. Hvordan bestemmer vi så, hvilken dimension der kommer først - bredden eller højden?"

"Lad os overveje den første mulighed. Bredde først, så højden. "Argumentet for denne tilgang er dette: alle lærer matematik i skolen, og de lærer, at koordinatpar skrives som 'x' (det vil sige den vandrette akse) og derefter 'y' (den lodrette dimension). Og dette er ikke kun en skolestandard - det er en almindeligt accepteret standard i matematik. Som de siger, man kan ikke argumentere med matematik."

"Er det sådan? Jamen, hvis vi ikke kan bekæmpe det, så først bredden og så højden?"

"Der er et interessant argument til fordel for 'højde først, så bredde' . Dette argument kommer fra hurtig initialisering af todimensionelle arrays. Når alt kommer til alt, hvis vi ønsker at initialisere vores array, så skriver vi kode som dette:"

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

"Så hvad gør det for os?"

"Lagde du mærke til noget? Hvad hvis vi har det her?

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

"Hvis vi skriver vores data i koden linje for linje, så får vi en tabel med 2 rækker og 5 kolonner."

"Nu kan jeg se. 2 er højden, og 5 er bredden... Så hvilken mulighed skal vi bruge?"

"Det er op til dig at beslutte, hvad der er mere bekvemt. Det vigtigste er, at alle programmører, der arbejder på det samme projekt, holder sig til den samme tilgang."

"Hvis du arbejder på et projekt, hvis kode har masser af initialiserede todimensionelle arrays, så vil alt det sandsynligvis være baseret på hurtig datainitialisering, dvs. du vil have standarden 'højde x bredde'.

"Hvis du befinder dig i et projekt, der involverer en masse matematik og arbejder med koordinater (for eksempel spilmotorer), så vil koden højst sandsynligt anvende 'bredde x højde'-tilgangen.

Hvordan todimensionelle arrays er arrangeret

"Nu, kan du huske den særlige egenskab ved todimensionelle arrays, som du lagde mærke til i begyndelsen af ​​lektionen?"

"Ja! Det var, at todimensionelle arrays faktisk er arrays af arrays!"

"Helt rigtigt. "Med andre ord, hvis i tilfælde af et almindeligt array en array-variabel gemmer en reference til en beholder, der gemmer array-elementer, så eksploderer situationen lidt i tilfælde af to-dimensionelle arrays: en to-dimensionel -array-variabel gemmer en reference til en beholder, der gemmer referencer til endimensionelle arrays. Det er bedre at se det i aktion én gang i stedet for at prøve at forklare det hundrede gange:"

Hvordan todimensionelle arrays er arrangeret

"Til venstre har vi en to-dimensional-array-variabel, som gemmer en reference til et to-dimensional-array-objekt. I midten er der et to-dimensionelt array-objekt, hvis celler gemmer en-dimensionelle arrays, som er rækker af et todimensionelt array. Og til højre kan du se fire endimensionelle arrays — rækkerne af vores todimensionelle array. Sådan fungerer todimensionelle arrays faktisk."

"Fantastisk! Men hvad giver det os?"

"Da en 'container af containere' gemmer referencer til 'arrays of rows', kan vi meget hurtigt og nemt bytte rækker. For at få en 'container af containere' skal du blot angive ét indeks i stedet for to. Eksempel:

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

"Se på koden nedenfor. Vi kan bruge den til at bytte rækker:"

// 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;
Todimensionelt array





matrix[0]gemmer en reference til den første række.
Vi bytter referencerne.

Som et resultat matrixser arrayet således ud:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

"Forstår det. Det fungerer som at bytte to almindelige genstande."

"Så det gør det. Tja, hvis du refererer til en celle i et todimensionelt array, men du kun angiver et indeks efter navnet på arrayet, så refererer du til en container af containere, hvis celler gemmer referencer til almindelig en- dimensionelle arrays."

"Alt virker logisk og klart. Tak for foredraget, Rishi!"

"Du er velkommen. Udfør det klogt i praksis."