"Hallo, mijn allerslimste leerling!"

"Hallo Rishi!"

"Verlang je naar een nieuwe discussie over arrays? Nou, vandaag hebben we er een voor je! Vandaag ga ik je vertellen over gekartelde en multidimensionale arrays."

"Klinkt bloeddorstig en beangstigend."

"Maak je geen zorgen, een echte programmeur kan altijd met een array omgaan, zelfs als hij zijn tanden laat zien. Grappen terzijde, de grilligheid van een array weerspiegelt niet alleen de mogelijkheid om de rijen van een tweedimensionale array te verwisselen, maar ook om een ​​array te construeren hoe het ook moet zijn.

"Stel dat u wilt dat de eerste rij van een tweedimensionale array een lengte van 10 heeft en de tweede rij 50."

"Kun je dat echt doen?"

"Absoluut! Eerst maken we een 'container met containers' - dit is de eerste array, waarin verwijzingen naar arrays van rijen worden opgeslagen. Zo werkt het:

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

"Je laat gewoon de tweede dimensie weg en de Java-machine maakt een container met containers. Dit is wat er in het geheugen zal zijn na het uitvoeren van deze code:

"En, nou, je weet al hoe je eendimensionale arrays maakt 🙂

Zo ziet de resulterende code eruit:

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

De nulde rij is een array van 10elementen
De eerste rij is een array van 50elementen

"We hebben zojuist een zogenaamde "gekartelde" array gemaakt. De randen zijn ruw en onregelmatig.

"En als we nu alle elementen van deze array op het scherm willen weergeven, dan lengthkomt de array van de array goed van pas: de lengtes van de rijen van de array zijn immers verschillend.

"Kun je me trouwens vertellen hoe ik de lengte van een 'container met containers' in ons voorbeeld kan vinden? Het is ook een array-object, wat betekent dat het een lengte heeft."

"Waarschijnlijk matrix.length?"

"Helemaal juist! En voor de arrays die de rijen vormen, zouden we matrix[0].lengthde nulde rij gebruiken."

"En voor de eerste betekent dat dat we matrix[1].length?"

"Helemaal juist. In het eerste geval levert het uitvoeren van de opdracht 10 op, en in het tweede geval is het resultaat 50.

Werken met een tweedimensionale array

"Laten we nu proberen een tweedimensionale array weer te geven:

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();
}
Maak een array
Vul de array met waarden


Buitenste lus die itereert over de rijen van de array.
Binnenste lus die zich herhaalt over de cellen van een enkele rij.

"Zoals je kunt zien, hebben we twee geneste lussen nodig. De eerste noemen we buitenste en de tweede - binnenste .

"In de buitenste lus (de ivariabele) doorlopen we achtereenvolgens alle rijen (arrays) waaruit onze tweedimensionale array bestaat. Elke waarde van ikomt overeen met een rij met die index.

"In de binnenste lus (de jvariabele) herhalen we alle cellen in de rijen. Dankzij de binnenste lus wordt een rij, die bestaat uit de waarden van één eendimensionale array, op het scherm weergegeven.

"Dit is wat er wordt weergegeven:

Eén regel van de array wordt verwerkt 1 2 3 4 5 6
Twee regels van de array worden verwerkt 1 2 3 4 5 6
1 2 3
Drie regels van de array worden verwerkt 1 2 3 4 5 6
1 2 3
1

Multidimensionale arrays

"Amigo! Heb je geraden dat als er tweedimensionale arrays zijn, er ook driedimensionale kunnen zijn?

"Ik zat daar net aan te denken, maar schaamde me om het te vragen.

"Ja, je kunt een driedimensionale array maken, en in het algemeen een array van elke dimensie. Dergelijke arrays worden 'multidimensionaal' genoemd. Laten we voor de lol een multidimensionale array maken met 4 dimensies.

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

"Dat lijkt me niet zo moeilijk!"

"Je hebt nog niet geprobeerd er handmatig een te maken! Kijk hier eens naar:

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
  }
}

"En dat is gewoon een array maken! Dan moet je er ook op de een of andere manier mee werken."

"Ik neem terug wat ik zei. Het is niet zo makkelijk om met ze samen te werken. Maar het is mogelijk."

"Aangezien het mogelijk is, is hier een bonustaak. Schrijf code die alle waarden in een driedimensionale array weergeeft. Je weet genoeg om dit te doen. Het belangrijkste is om geduldig en attent te zijn. Of misschien vindingrijk zijn (er is een geheim stukje van kennis die je zal helpen deze taak in een enkele regel op te lossen). Maar hoe je het ook oplost, los het op."

"Dank je, Rishi. Ik zal het proberen."