1. Zweidimensionale Arrays

Noch eine interessante Tatsache über Arrays. Arrays sind nicht nur eindimensional (linear). Sie können auch zweidimensional sein.

Was bedeutet das, fragen Sie?

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, „ width “ die Tabellenbreite (in Zellen) und „ height “ die Tabellenhöhe. Beispiel:

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

So wird es in der Erinnerung aussehen:

Zweidimensionale Arrays

Übrigens können Sie die schnelle Initialisierung auch für zweidimensionale Arrays verwenden:

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

Es gibt so viele Stellen, an denen Sie als Programmierer ein zweidimensionales Array benötigen könnten. Zweidimensionale Anordnungen sind die Grundlage fast aller Brettspiele, z. B. Schach, Dame, Tic-Tac-Toe und Seeschlacht:

Zweidimensionale Arrays 2

Zweidimensionale Arrays eignen sich perfekt für Schach oder Seeschlachten. Wir benötigen nur Zahlen aus Zellkoordinaten. Nicht „Bauer e2-e4“, sondern „Bauer (5,2) -> (5,4)“. Für Sie als Programmierer wird es noch einfacher.


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

Hier gibt es übrigens ein interessantes Dilemma:

Wenn wir ein Array mit erstellen new int[2][5];, haben wir dann eine Tabelle mit „zwei Zeilen und 5 Spalten “ oder handelt es sich um „zwei Spalten und 5 Zeilen “?“ Mit anderen Worten: Geben wir zuerst die Breite und dann die Höhe an ... oder umgekehrt, erst die Höhe und dann die Breite? Na ja, wie wir oft sagen, hier ist nicht alles so einfach.

Beginnen wir mit der Frage, wie das Array im Speicher abgelegt wird .

Natürlich enthält der Computerspeicher nicht wirklich eine Matrix: Jeder Ort im Speicher hat eine fortlaufende numerische Adresse: 0, 1, 2, ... In unserem Fall sprechen wir von einer 2 × 5-Matrix, aber im Speicher es sind nur 10 aufeinanderfolgende Zellen, mehr nicht. Nichts weist darauf hin, wo sich die Zeilen und Spalten befinden.

Argument für „Breite x Höhe“.

Das Argument für diesen Ansatz ist, dass jeder in der Schule Mathematik lernt und lernt, dass Koordinatenpaare als „x“ (also die horizontale Achse) und dann als „y“ (die vertikale Dimension) geschrieben werden. Und das ist nicht nur ein Schulstandard, sondern ein allgemein anerkannter Standard in der Mathematik. Wie man so schön sagt, kann man über Mathematik nicht streiten. Ist das so? Erst Breite und dann Höhe?

Argument für „Höhe x Breite“.

Für diese Position gibt es auch ein interessantes Argument: die schnelle Initialisierung zweidimensionaler Arrays. Wenn wir unser Array initialisieren möchten, können wir tatsächlich Code wie diesen schreiben:

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

Merkst du nichts? Was ist, wenn wir das haben?

// 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 Matrix mit 2 Zeilen und 5 Spalten.

Endeffekt

Was können wir sagen? Es liegt an Ihnen, zu entscheiden, was für Sie 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, dh Sie haben den Standard „Höhe x Breite“.

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


3. Wie zweidimensionale Arrays angeordnet sind

Und jetzt erfahren Sie, wie zweidimensionale Arrays tatsächlich angeordnet sind. Bereit?

Zweidimensionale Arrays sind eigentlich Arrays von Arrays!

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: Eine zweidimensionale Array-Variable speichert a Verweis auf einen Container, der Verweise auf eindimensionale Arrays speichert. Es ist besser, es einmal in Aktion zu sehen, als zu versuchen, 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. ImIn der Mitte haben wir ein zweidimensionales Array-Objekt, dessen Zellen eindimensionale Arrays speichern, die die Zeilen eines zweidimensionalen Arrays sind. Und rechts sehen Sie vier eindimensionale Arrays – die Zeilen unseres zweidimensionalen Arrays .

So funktionieren zweidimensionale Arrays tatsächlich. Und dieser Ansatz bietet dem Java-Programmierer mehrere Vorteile:

Erstens können wir Zeilen sehr schnell und einfach austauschen, da ein „Container von Containern“ Verweise auf „Arrays von Zeilen“ speichert. 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];

Mit diesem Code können Sie Zeilen vertauschen:

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

Wenn Sie auf eine Zelle eines zweidimensionalen Arrays verweisen, aber nach dem Namen des Arrays nur einen Index angeben, beziehen Sie sich auf einen Container von Containern, in dessen Zellen Verweise auf gewöhnliche eindimensionale Arrays gespeichert sind.