1. Todimensionelle arrays

Endnu et interessant faktum om arrays. Arrays er ikke kun endimensionelle (lineære). De kan også være todimensionelle.

Hvad betyder det, spørger du?

Dette 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. Eksempel:

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

Sådan vil det se ud i hukommelsen:

Todimensionelle arrays

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

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

Der er så mange steder, hvor du som programmør måske har brug for et todimensionelt array. Todimensionelle arrays er grundlaget for næsten alle brætspil, f.eks. skak, dam, tic-tac-toe og søslag:

Todimensionelle arrays 2

Todimensionelle arrays er de perfekte til skak eller søkamp. Vi behøver kun tal fra cellekoordinater. Ikke 'bonde e2-e4', men 'bonde (5,2) -> (5,4)'. Det bliver endnu nemmere for dig som programmør.


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

Forresten er der et interessant dilemma her:

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, specificerer vi først bredden og derefter højden... eller omvendt, først højden og derefter bredden?Tja, som vi ofte siger, er alt ikke så enkelt her.

Lad os starte med spørgsmålet om, hvordan arrayet er gemt i hukommelsen .

Selvfølgelig har computerhukommelsen faktisk ikke en matrix i sig: hver placering i hukommelsen har en sekventiel numerisk adresse: 0, 1, 2, ... I vores tilfælde taler vi om en 2 × 5 matrix, men i hukommelsen det er kun 10 på hinanden følgende celler, intet mere. Intet angiver, hvor rækkerne og kolonnerne er.

Argument for "bredde x højde".

Argumentet for denne tilgang er, at alle lærer matematik i skolen, hvor 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 rigtigt? Først bredde og så højde?

Argument for "højde x bredde".

Der er også et interessant argument at fremføre for denne position: hurtig initialisering af todimensionelle arrays. Faktisk, hvis vi ønsker at initialisere vores array, så kan vi skrive kode som dette:

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

Lægger du ikke mærke til noget? Hvad hvis vi har dette?

// 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 matrix med 2 rækker og 5 kolonner.

Bundlinie

Hvad kan vi sige? Det er op til dig at beslutte, hvad der er mere bekvemt for dig. 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 to-dimensionelle arrays, så vil alt sandsynligvis være baseret på hurtig datainitialisering, dvs. du vil have standarden 'højde x bredde'.

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


3. Hvordan todimensionelle arrays er arrangeret

Og nu vil du lære, hvordan todimensionelle arrays faktisk er arrangeret. Parat?

Todimensionelle arrays er faktisk arrays af arrays!

Med andre ord, hvis en array-variabel i tilfælde af et almindeligt array gemmer en reference til en beholder, der gemmer array-elementer, så eksploderer situationen lidt i tilfælde af to-dimensionelle arrays: en to-dimensional-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 deni midten har vi et todimensionalt arrayobjekt, hvis celler gemmer endimensionelle arrays, som er rækkerne i 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. Og denne tilgang giver Java-programmøren flere fordele:

For det første , da en 'container med 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 et indeks i stedet for to. Eksempel:

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

Denne kode lader dig 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}
};

Hvis du henviser til en celle i et todimensionelt array, men du kun angiver et indeks efter navnet på arrayet, så refererer du til en container af beholdere, hvis celler gemmer referencer til almindelige endimensionelle arrays.