"Hej, min allra smartaste elev!"

"Hej Rishi!"

"Tränar du efter en ny diskussion om arrayer? Tja, idag har vi en till dig! Idag ska jag berätta om taggiga och flerdimensionella arrayer."

"Låter blodtörstig och skrämmande."

"Oroa dig inte, en riktig programmerare kan alltid hantera en array, även när den blottar sina tänder. Skämt åsido, en arrays taggighet återspeglar förmågan att inte bara byta rader i en tvådimensionell array, utan också att konstruera en array hur det än måste vara.

"Låt oss säga att du vill att den första raden i en tvådimensionell array ska ha en längd på 10 och att den andra ska vara 50."

"Kan du verkligen göra det?"

"Absolut! Först skapar vi en 'behållare med behållare' — det här är den första arrayen som kommer att lagra referenser till arrayer av rader. Så här görs det:

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

"Du utelämnar helt enkelt den andra dimensionen och Java-maskinen skapar en behållare med behållare. Detta är vad som kommer att finnas i minnet efter att ha kört den här koden:

"Och ja, du vet redan hur man skapar endimensionella arrayer 🙂

Så här kommer den resulterande koden att se ut:

// Matrix of important data
int[][] matrix = new int[2][];
matrix[0] = new int[10];
matrix[1] = new int[50]
Tvådimensionell array

Den nollte raden är en array av 10element
Den första raden är en array av 50element

"Vi har precis skapat en så kallad "jagged" array. Dess kanter är grova och oregelbundna.

"Och om vi nu vill visa alla element i denna array på skärmen, så kommer arrayens lengtharray att komma till nytta: trots allt är längden på arrayens rader olika.

"Kan du förresten berätta för mig hur man hittar längden på en 'container of containers' i vårt exempel? Det är också ett array-objekt, vilket betyder att det har en längd."

"Förmodligen matrix.length?"

"Helt riktigt! Och för arrayerna som bildar raderna skulle vi använda matrix[0].lengthför den nollte raden."

"Och för det första betyder det att vi skulle använda ? matrix[1].length"

"Helt riktigt. I det första fallet kommer exekveringen av kommandot att ge 10, och i det andra fallet blir resultatet 50.

Arbeta med en tvådimensionell array

"Låt oss nu försöka visa en tvådimensionell array:

int[][] matrix = new int[3][];
matrix[0] = {1, 2, 3, 4, 5, 6};
matrix[1] = {1, 2, 3};
matrix[2] = {1};
for (int i = 0; i < matrix.length; i++)
{
   for (int j = 0; j < matrix[i].length; j++)
      System.out.print( matrix[i][j] + " " );
   System.out.println();
}
Skapa en array
Fyll arrayen med värden


Yttre loop som itererar över raderna i arrayen.
Inre slinga som itererar över cellerna i en enda rad.

"Som du kan se behöver vi två kapslade slingor. Den första kallar vi yttre och den andra - inre .

"I den yttre slingan ( ivariabeln) går vi sekventiellt igenom alla rader (arrayer) som utgör vår tvådimensionella array. Varje värde på imotsvarar en rad med det indexet.

"I den inre slingan ( jvariabeln) itererar vi över alla celler i raderna. Tack vare den inre slingan kommer en rad, som består av värdena för en endimensionell array, att visas på skärmen.

"Det här är vad som kommer att visas:

En rad i arrayen bearbetas 1 2 3 4 5 6
Två rader i arrayen bearbetas 1 2 3 4 5 6
1 2 3
Tre rader i arrayen bearbetas 1 2 3 4 5 6
1 2 3
1

Flerdimensionella arrayer

"Amigo! Gissade du att om det finns tvådimensionella arrayer, så kan det också finnas tredimensionella sådana?

"Jag tänkte bara på det, men skämdes över att fråga.

"Ja, du kan skapa en tredimensionell array, och i allmänhet en array av vilken dimension som helst. Sådana arrayer kallas 'flerdimensionella'. Bara för skojs skull, låt oss skapa en flerdimensionell array som har 4 dimensioner.

 int[][][][] matrix = new int[2][3][4][5];

"Det verkar inte särskilt svårt!"

"Du har inte försökt skapa en manuellt än! Här kan du njuta av det här:

int[][][][] matrix;
matrix = new int[2][][][];                   // Create a 2-element array of references to references to references
for (int i = 0; i < matrix.length; i++)
{
  matrix[i] = new int[3][][];                // Create a 3-element array of references to references
  for (j = 0; j < matrix[i].length; j++)
  {
    matrix[i][j] = new int[4][];             // Create a 4-element array of references
    for (k = 0; k < matrix[i][j].length; k++)
      matrix[i][j][k] = new int[5];          // Create 5-element arrays of integers
  }
}

"Och det är bara att skapa en array! Då måste du också jobba med den på något sätt."

"Jag tar tillbaka det jag sa. Det är inte så lätt att arbeta med dem. Men det är möjligt."

"Eftersom det är möjligt, här är en bonusuppgift. Skriv kod som visar alla värden i en tredimensionell array. Du vet tillräckligt för att göra detta. Huvudsaken är att vara tålmodig och uppmärksam. Eller kanske vara påhittig (det finns en hemlig bit kunskap som hjälper dig att lösa denna uppgift på en enda rad). Men oavsett hur du löser den, lös den."

"Tack, Rishi. Jag ska försöka."