Ein Vorlesungsausschnitt mit einem Mentor im Rahmen des Codegym University-Kurses. Melden Sie sich für den gesamten Kurs an.


„Grüße, Amigo!“

„Hallo, Rishi!“

„Sie wissen bereits ein oder zwei Dinge über Arrays, und ich hoffe, Sie haben es sogar geschafft, einige Aufgaben zu lösen. Aber Sie wissen nicht alles. Hier ist zum Beispiel eine weitere interessante Tatsache über Arrays. Arrays sind nicht nur eindimensional (linear). ). Sie können auch zweidimensional sein.“

„Ähm... Was bedeutet das?“

„Das bedeutet, dass die Zellen des Arrays nicht nur eine Spalte (oder Zeile), sondern auch eine rechteckige Tabelle darstellen können.“

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

„Dabei ist Name der Name der Array-Variablen, Breite die Tabellenbreite (in Zellen) und Höhe die Tabellenhöhe. Schauen Sie sich ein Beispiel an:

int[][] data = new int[2][5];
data[1][1] = 5;
Wir erstellen ein zweidimensionales Array: 2 Spalten und 5 Zeilen.
Wir schreiben 5 in Zelle (1,1).

„So wird es in der Erinnerung aussehen:

Zweidimensionale Arrays

„Für zweidimensionale Arrays kann man übrigens auch die Schnellinitialisierung nutzen:

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

„Hmm... das ist jetzt interessant. Wenn wir uns vorstellen, dass die ersten inneren Klammern ein Element darstellen, die nächste ein zweites... Ein zweidimensionales Array ist also wie ein Array von Arrays?“

„Was für ein kluger Schüler Sie sind! Genau. Das erste Element ist das eindimensionale Array {31, 28, 31}, das zweite ist {30, 31, 30}und so weiter. Aber wir werden etwas später in dieser Lektion darauf zurückkommen. Versuchen Sie bis dahin, darüber nachzudenken ein zweidimensionales Array als Tabelle mit Zeilen und Spalten, die an jedem Schnittpunkt Zellen bilden.

„Davon habe ich mir eine Vorstellung gemacht. Übrigens, wofür werden diese zweidimensionalen Arrays verwendet?“

„Programmierer benötigen ziemlich oft zweidimensionale Arrays. Wenn man genau hinschaut, wird fast jedes Brettspiel mit einem handelsüblichen zweidimensionalen Array implementiert: Schach, Dame, Tic-Tac-Toe, Seeschlacht usw.:“

Seeschlacht

„Ich verstehe! Das Spielfeld von Schach oder Seeschlacht passt perfekt auf zweidimensionale Felder!“

„Ja, aber Sie müssen Zahlen als Zellenkoordinaten verwenden. Nicht ‚Bauer e2-e4‘, sondern ‚Bauer (5,2) -> (5,4)‘. Für Sie als Programmierer wird es noch einfacher. "

Elemente in Arrays anordnen: (x, y) oder (y, x)

„Das Erstellen zweidimensionaler Arrays wirft ein interessantes Dilemma auf. Wenn wir ein Array mit erstellen new int [2][5];, haben wir dann eine Tabelle mit ‚zwei Zeilen und 5 Spalten ‘ oder ist es ‚zwei Spalten und 5 Zeilen‘?“

„Mit anderen Worten, es ist nicht ganz klar, ob wir zuerst die Breite und dann die Höhe angeben ... oder umgekehrt, zuerst die Höhe und dann die Breite?“

„Ja, das ist das Dilemma. Und es gibt keine eindeutige Antwort.“

"Was zu tun ist?"

„Zuerst ist es wichtig zu verstehen, wie unser zweidimensionales Array tatsächlich im Speicher gespeichert ist . Natürlich enthält der Computerspeicher keine Tabellen: Jeder Speicherort im Speicher hat eine fortlaufende numerische Adresse: 0, 1, 2, ... Für uns ist das eine 2×5-Tabelle, aber im Speicher sind es nur 10 Zellen, mehr nicht. Keine Unterteilung in Zeilen und Spalten.“

„Das habe ich verstanden. Wie bestimmen wir dann, welches Maß zuerst kommt – die Breite oder die Höhe?“

„Betrachten wir die erste Option. Zuerst die Breite, dann die Höhe. “ Das Argument für diesen Ansatz ist folgendes: Jeder lernt in der Schule Mathematik und lernt, dass Koordinatenpaare als „x“ (also die horizontale Achse) geschrieben werden. und dann 'y' (die vertikale Dimension). Und das ist nicht nur ein Schulstandard, sondern ein allgemein anerkannter Standard in der Mathematik. Wie man so schön sagt: Über Mathematik lässt sich nicht streiten.

„Ist das so? Na ja, wenn wir es nicht bekämpfen können, dann erst die Breite und dann die Höhe?“

„Es gibt ein interessantes Argument für ‚Zuerst Höhe, dann Breite‘ . Dieses Argument kommt von der schnellen Initialisierung zweidimensionaler Arrays. Wenn wir unser Array initialisieren wollen, schreiben wir schließlich Code wie diesen:“

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

„Und was bringt uns das?“

„Ist dir etwas aufgefallen? Was wäre, wenn wir das hier hätten?“

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

„Wenn wir unsere Daten Zeile für Zeile in den Code schreiben, dann erhalten wir eine Tabelle mit 2 Zeilen und 5 Spalten.“

„Jetzt verstehe ich. 2 ist die Höhe und 5 ist die Breite ... Welche Option sollten wir dann verwenden?“

„Es liegt an Ihnen, zu entscheiden, was bequemer ist. Das Wichtigste ist, dass alle Programmierer, die an demselben Projekt arbeiten, den gleichen Ansatz verfolgen.“

„Wenn Sie an einem Projekt arbeiten, dessen Code viele initialisierte zweidimensionale Arrays enthält, basiert höchstwahrscheinlich alles auf einer schnellen Dateninitialisierung, d. h. Sie haben den Standard ‚Höhe x Breite‘.“

„Wenn Sie sich in einem Projekt befinden, das viel Mathematik erfordert und mit Koordinaten arbeitet (z. B. Spiel-Engines), wird der Code höchstwahrscheinlich den Ansatz „Breite x Höhe“ übernehmen.

Wie zweidimensionale Arrays angeordnet sind

„Erinnern Sie sich noch an die Besonderheit zweidimensionaler Arrays, die Ihnen zu Beginn der Lektion aufgefallen ist?“

„Ja! Zweidimensionale Arrays sind eigentlich Arrays von Arrays!“

„Ganz richtig.“ Mit anderen Worten, wenn im Fall eines gewöhnlichen Arrays eine Array-Variable einen Verweis auf einen Container speichert, der Array-Elemente speichert, dann explodiert die Situation im Fall von zweidimensionalen Arrays ein wenig: ein zweidimensionales Die Variable -array speichert einen Verweis auf einen Container, der Verweise auf eindimensionale Arrays speichert. Es ist besser, es einmal in Aktion zu sehen, als es hundertmal zu erklären:“

Wie zweidimensionale Arrays angeordnet sind

„Auf der linken Seite haben wir eine zweidimensionale Array-Variable, die einen Verweis auf ein zweidimensionales Array-Objekt speichert. In der Mitte befindet sich ein zweidimensionales Array-Objekt, dessen Zellen eindimensionale Arrays speichern Zeilen eines zweidimensionalen Arrays. Und auf der rechten Seite sehen Sie vier eindimensionale Arrays – die Zeilen unseres zweidimensionalen Arrays. So funktionieren zweidimensionale Arrays tatsächlich.“

„Fantastisch! Aber was bringt es uns?“

„Da ein ‚Container mit Containern‘ Referenzen auf ‚Arrays mit Zeilen‘ speichert, können wir Zeilen sehr schnell und einfach austauschen. Um einen ‚Container mit Containern‘ zu erhalten, müssen Sie nur einen Index anstelle von zwei angeben. Beispiel:

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

„Sehen Sie sich den Code unten an. Wir können ihn zum Austauschen von Zeilen verwenden:“

// 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;
Zweidimensionales Array





matrix[0]speichert einen Verweis auf die erste Zeile.
Wir tauschen die Referenzen aus.

Als Ergebnis matrixsieht das Array so aus:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

„Verstanden. Es funktioniert so, als würde man zwei normale Gegenstände austauschen.“

„So ist es. Nun, wenn Sie sich auf eine Zelle eines zweidimensionalen Arrays beziehen, aber nach dem Namen des Arrays nur einen Index angeben, dann beziehen Sie sich auf einen Container von Containern, deren Zellen Verweise auf gewöhnliche ein- dimensionale Arrays.“

„Alles scheint logisch und klar. Danke für den Vortrag, Rishi!“

„Gerne geschehen. Setzen Sie es mit Bedacht in die Praxis um.“