En forelesningsbit med en mentor som en del av Codegym University-kurset. Meld deg på hele kurset.


"Hilsen, Amigo!"

"Hei, Rishi!"

"Du vet allerede en ting eller to om matriser, og du klarte til og med å løse noen oppgaver, håper jeg. Men du vet ikke alt. For eksempel, her er et annet interessant faktum om matriser. Matriser er ikke bare endimensjonale (lineære ). De kan også være todimensjonale."

"Ehm... Hva betyr det?"

"Dette betyr at cellene i matrisen ikke bare kan representere en kolonne (eller rad), men også en rektangulær tabell.

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

"Der navn er navnet på matrisevariabelen, bredde er tabellbredden (i celler), og høyde er tabellhøyden. Ta en titt på et eksempel:

int[][] data = new int[2][5];
data[1][1] = 5;
Vi lager en todimensjonal matrise: 2 kolonner og 5 rader.
Vi skriver 5 i celle (1,1).

"Slik vil det se ut i minnet:

Todimensjonale arrays

"Forresten, for todimensjonale arrays kan du også bruke rask 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... nå er det interessant. Hvis vi forestiller oss at i de første indre parentesene representerer ett element, er det neste et andre... Så en todimensjonal matrise er som en matrise av matriser?"

"For en smart student du er! Akkurat. Det første elementet er den endimensjonale matrisen {31, 28, 31}, det andre er {30, 31, 30}, og så videre. Men vi kommer tilbake til det litt senere i denne leksjonen. Inntil da, prøv å tenke på en todimensjonal matrise som en tabell med rader og kolonner, som danner celler ved hvert skjæringspunkt.

"Jeg har et mentalt bilde av det. Forresten, hva brukes de til, disse todimensjonale arrayene?"

"Programmerer trenger todimensjonale arrayer ganske ofte. Hvis du ser nøye etter, implementeres nesten alle brettspill ved å bruke en todimensjonal array som er tilgjengelig: sjakk, dam, tic-tac-toe, sjøslag, etc.:"

sjøslag

"Jeg skjønner det! Spillefeltet for sjakk eller sjøkamp passer perfekt på todimensjonale arrays!"

"Ja, men du må bruke tall som cellekoordinater. Ikke 'bonde e2-e4', men 'bonde (5,2) -> (5,4)'. Det blir enda enklere for deg som programmerer. "

Ordne elementer i matriser: (x, y) eller (y, x)

"Å lage todimensjonale arrays reiser et interessant dilemma. Når vi lager en array ved å bruke new int [2][5];, har vi en tabell med 'to rader og 5 kolonner ' eller er det 'to kolonner og 5 rader'?"

"Med andre ord, det er ikke helt klart om vi først spesifiserer bredden og deretter 'høyden... eller omvendt, først høyden og deretter bredden?"

"Ja, dette er dilemmaet. Og det finnes ikke noe sikkert svar."

"Hva å gjøre?"

"Først er det viktig å forstå hvordan vår todimensjonale array faktisk er lagret i minnet . Naturligvis har datamaskinens minne faktisk ingen tabeller i seg: hver plassering i minnet har en sekvensiell numerisk adresse: 0, 1, 2, ... For oss er dette en 2 × 5 tabell, men i minnet er det bare 10 celler, ingenting mer. Ingen inndeling i rader og kolonner."

"Jeg forsto det. Hvordan skal vi da finne ut hvilken dimensjon som kommer først - bredden eller høyden?"

"La oss vurdere det første alternativet. Bredde først, deretter høyde. "Argumentet for denne tilnærmingen er dette: alle lærer matematikk på skolen, og de lærer at koordinatpar skrives som 'x' (det vil si den horisontale aksen) og deretter 'y' (den vertikale dimensjonen). Og dette er ikke bare en skolestandard - det er en generelt akseptert standard i matematikk. Som de sier, du kan ikke argumentere med matematikk."

"Er det slik? Vel, hvis vi ikke kan kjempe mot det, så først bredden og så høyden?"

"Det er et interessant argument til fordel for 'høyde først, så bredde' . Dette argumentet kommer fra rask initialisering av todimensjonale arrays. Tross alt, hvis vi ønsker å initialisere arrayen vår, så skriver vi kode slik:"

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

"Så hva gjør det for oss?"

"La du merke til noe? Hva om vi har dette?

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

"Hvis vi skriver dataene våre i koden linje for linje, får vi en tabell med 2 rader og 5 kolonner."

"Nå ser jeg. 2 er høyden, og 5 er bredden... Så hvilket alternativ skal vi bruke?"

"Det er opp til deg å bestemme hva som er mer praktisk. Det viktigste er at alle programmerere som jobber med det samme prosjektet holder seg til samme tilnærming."

"Hvis du jobber med et prosjekt der koden har mange initialiserte todimensjonale arrays, vil mest sannsynlig alt være basert på rask datainitialisering, dvs. at du vil ha standarden "høyde x bredde".

"Hvis du befinner deg i et prosjekt som involverer mye matematikk og arbeider med koordinater (for eksempel spillmotorer), vil koden mest sannsynlig bruke "bredde x høyde"-tilnærmingen.

Hvordan todimensjonale arrays er ordnet

"Nå, husker du det spesielle med todimensjonale arrays som du la merke til i begynnelsen av leksjonen?"

"Ja! Det var at todimensjonale arrays faktisk er arrays av arrays!"

"Helt riktig. "Med andre ord, hvis i tilfelle av en ordinær matrise en matrisevariabel lagrer en referanse til en beholder som lagrer matriseelementer, så eksploderer situasjonen litt i tilfelle av todimensjonale matriser: en todimensjonal -array-variabel lagrer en referanse til en beholder som lagrer referanser til endimensjonale arrays. Det er bedre å se det i aksjon en gang i stedet for å prøve å forklare det hundre ganger:"

Hvordan todimensjonale arrays er ordnet

"Til venstre har vi en todimensjonal matrisevariabel, som lagrer en referanse til et todimensjonal matriseobjekt. I midten er det et todimensjonalt matriseobjekt hvis celler lagrer endimensjonale matriser, som er rader i en todimensjonal matrise. Og til høyre kan du se fire endimensjonale matriser – radene i vår todimensjonale matrise. Dette er hvordan todimensjonale matriser faktisk fungerer."

"Fantastisk! Men hva gir det oss?"

"Siden en "container of containers" lagrer referanser til "arrays of rows", kan vi raskt og enkelt bytte rader. For å få en "container of containers" trenger du bare å spesifisere én 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 bruke den til å bytte rader:"

// 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;
Todimensjonal matrise





matrix[0]lagrer en referanse til den første raden.
Vi bytter referanser.

Som et resultat matrixser matrisen slik ut:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

"Skjønner det. Det fungerer som å bytte to vanlige gjenstander."

"Så det gjør det. Vel, hvis du refererer til en celle i en todimensjonal matrise, men du bare spesifiserer en indeks etter navnet på matrisen, så refererer du til en container med containere hvis celler lagrer referanser til vanlig en- dimensjonale matriser."

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

"Du er velkommen. Sett det i praksis klokt."