1. Todimensjonale arrays

Et annet interessant faktum om matriser. Matriser er ikke bare endimensjonale (lineære). De kan også være todimensjonale.

Hva betyr det, spør du?

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, er bredden tabellbredden (i celler), og høyden er tabellhøyden. Eksempel:

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

Slik vil det se ut i minnet:

Todimensjonale arrays

Forresten, du kan også bruke rask initialisering for todimensjonale arrays:

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

Det er så mange steder hvor du som programmerer kan trenge en todimensjonal matrise. Todimensjonale arrays er grunnlaget for nesten alle brettspill, f.eks. sjakk, dam, tic-tac-toe og sjøkamp:

Todimensjonale arrays 2

Todimensjonale arrays er perfekte for sjakk eller sjøkamp. Vi trenger bare tall fra cellekoordinater. Ikke 'bonde e2-e4', men 'bonde (5,2) -> (5,4)'. Det blir enda enklere for deg som programmerer.


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

Forresten, det er et interessant dilemma her:

Når vi lager en matrise med 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, spesifiserer vi først bredden og deretter høyden... eller omvendt, først høyden og deretter bredden? Vel, som vi ofte sier, er ikke alt så enkelt her.

La oss starte med spørsmålet om hvordan matrisen er lagret i minnet .

Dataminne har selvfølgelig ikke en matrise i seg: hver plassering i minnet har en sekvensiell numerisk adresse: 0, 1, 2, ... I vårt tilfelle snakker vi om en 2 × 5 matrise, men i minnet det er bare 10 påfølgende celler, ikke noe mer. Ingenting indikerer hvor radene og kolonnene er.

Argument for "bredde x høyde".

Argumentet for denne tilnærmingen er dette at alle lærer matematikk på skolen, der 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? Først bredde og så høyde?

Argument for "høyde x bredde".

Det er også et interessant argument for denne posisjonen: rask initialisering av todimensjonale arrays. Faktisk, hvis vi ønsker å initialisere matrisen vår, kan vi skrive kode slik:

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

Merker du ingenting? 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 matrise med 2 rader og 5 kolonner.

Bunnlinjen

Hva kan vi si? Det er opp til deg å bestemme hva som er mer praktisk for deg. Det viktigste er at alle programmerere som jobber med samme prosjekt 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. du vil ha standarden 'høyde x bredde'.

Hvis du er heldig nok til å finne deg selv 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.


3. Hvordan todimensjonale arrays er ordnet

Og nå vil du lære hvordan todimensjonale arrays faktisk er ordnet. Klar?

Todimensjonale arrays er faktisk arrays av arrays!

Med andre ord, hvis i tilfellet med en ordinær matrise en matrisevariabel lagrer en referanse til en beholder som lagrer matriseelementer, så eksploderer situasjonen litt i tilfellet med todimensjonale matriser: en todimensjonal matrisevariabel lagrer en referanse til en beholder som lagrer referanser til endimensjonale matriser. Det er bedre å se det i aksjon én 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 todimensjonalt matriseobjekt. Imidten har vi et todimensjonalt arrayobjekt hvis celler lagrer endimensjonale arrays, som er radene i en todimensjonal array. Og til høyre kan du se fire endimensjonale arrays - radene i vår todimensjonale array.

Dette er hvordan todimensjonale arrays faktisk fungerer. Og denne tilnærmingen gir Java-programmereren flere fordeler:

For det første , siden en "beholder med containere" lagrer referanser til "arrays of rows", kan vi raskt og enkelt bytte rader. For å få en "container av containere", trenger du bare å spesifisere en indeks i stedet for to. Eksempel:

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

Denne koden lar deg 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}
};

Hvis du refererer til en celle i en todimensjonal matrise, men du bare spesifiserer én indeks etter navnet på matrisen, så refererer du til en beholder med beholdere hvis celler lagrer referanser til vanlige endimensjonale matriser.