Wie kann man sich beim Erstellen eines 2D-Arrays daran erinnern, ob zuerst Zeilen oder Spalten angegeben werden?
Antworten:
Java wird als "Zeilenmajor" betrachtet, was bedeutet, dass zuerst Zeilen ausgeführt werden. Dies liegt daran, dass ein 2D-Array ein "Array von Arrays" ist.
Zum Beispiel:
int[ ][ ] a = new int[2][4]; // Two rows and four columns.
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
Es kann auch eher so dargestellt werden:
a[0] -> [0] [1] [2] [3]
a[1] -> [0] [1] [2] [3]
Die zweite Abbildung zeigt den Aspekt "Array of Arrays". Das erste Array enthält {a[0] and a[1]}
, und jedes davon ist ein Array, das vier Elemente enthält {[0][1][2][3]}
.
TL; DR Zusammenfassung:
Array[number of arrays][how many elements in each of those arrays]
Weitere Erklärungen finden Sie auch unter Arrays - 2-dimensional .
Während Matt B in gewissem Sinne wahr sein mag, kann es hilfreich sein, an ein mehrdimensionales Java-Array zu denken, ohne an geometerische Matrizen zu denken. Java-Multi-Dim-Arrays sind einfach Arrays von Arrays, und jedes Element der ersten "Dimension" kann eine andere Größe als die anderen Elemente haben oder tatsächlich ein Null-Sub-Array speichern. Siehe Kommentare unter dieser Frage
Instinktiv denkt man geometrisch: horizontale (X) Achse und dann vertikale (Y) Achse. Dies ist jedoch bei einem 2D-Array nicht der Fall. Zuerst kommen Zeilen und dann Spalten.
Betrachten Sie die folgende Analogie: In der Geometrie geht man zur Leiter (X-Achse) und klettert darauf (Y-Achse). Umgekehrt steigt man in Java die Leiter (Zeilen) hinunter und geht weg (Spalten).
To be crystal clear, it is not merely OK to ask and answer your own question, it is explicitly encouraged.
Alles hängt von Ihrer Visualisierung des Arrays ab. Zeilen und Spalten sind Eigenschaften der Visualisierung (wahrscheinlich in Ihrer Vorstellung) des Arrays, nicht des Arrays selbst.
Es ist genau das gleiche wie zu fragen, ob die Nummer "5" rot oder grün ist.
Ich könnte es rot zeichnen, ich könnte es Gier zeichnen, oder? Farbe ist keine integrale Eigenschaft einer Zahl. Ebenso ist es für die Existenz dieses Arrays nicht erforderlich, ein 2D-Array als Raster aus Zeilen und Spalten darzustellen.
2D-Arrays haben nur eine erste und eine zweite Dimension . Alles, was mit der Visualisierung dieser Elemente zu tun hat , ist nur Ihr Geschmack.
Wenn ich ein Char-Array habe char[80][25]
, möchte ich es möglicherweise auf einer gedrehten Konsole drucken, sodass ich 25 Zeilen mit 80 Zeichen habe, die ohne Bildlauf auf den Bildschirm passen.
Ich werde versuchen, ein brauchbares Beispiel zu liefern, wenn die Darstellung eines 2D-Arrays als Zeilen und Spalten überhaupt keinen Sinn ergibt : Angenommen, ich benötige ein Array mit 1 000 000 000 Ganzzahlen. Mein Computer verfügt über 8 GB RAM, daher habe ich genügend Speicher dafür. Wenn Sie jedoch versuchen, die Ausführung auszuführen var a = new int[1000000000]
, wird höchstwahrscheinlich eine OutOfMemory-Ausnahme angezeigt. Das liegt an der Speicherfragmentierung - es gibt keinen aufeinanderfolgenden Speicherblock dieser Größe. Stattdessen können Sie mit Ihren Werten ein 2D-Array von 10 000 x 100 000 erstellen. Logischerweise handelt es sich um ein 1D-Array, daher möchten Sie es als eine einzelne Folge von Werten zeichnen und sich vorstellen. Aufgrund der technischen Implementierung handelt es sich jedoch um 2D.
In Java gibt es keine mehrdimensionalen Arrays. Es gibt Arrays von Arrays. Damit:
int[][] array = new int[2][3];
Es besteht tatsächlich aus zwei Arrays mit jeweils drei Elementen.
Der beste Weg, sich daran zu erinnern, ob Zeilen oder Spalten an erster Stelle stehen, besteht darin, einen Kommentar zu schreiben und ihn zu erwähnen.
Java speichert ein 2D-Array nicht als Tabelle mit angegebenen Zeilen und Spalten, sondern als Array von Arrays, wie viele andere Antworten erklären. So können Sie entscheiden, ob die erste oder zweite Dimension Ihre Zeile ist. Abhängig davon müssen Sie nur das Array lesen.
Da ich selbst die ganze Zeit verwirrt bin, schreibe ich immer einen Kommentar, der mir sagt, welche Dimension des 2d-Arrays meine Zeile und welche meine Spalte ist.
In Java werden die Zeilen zuerst erstellt, da ein zweidimensionales Array als zwei separate Arrays betrachtet wird. Beginnt mit dem Dimensionsarray der ersten Zeile 1.
In c ++ (entfernter, staubiger Speicher) war es meiner Meinung nach etwas einfacher, den Code zu betrachten und Arrays zu verstehen, als dies manchmal in Java der Fall ist. Beide sind Reihenmajor. Diese Illustration hat mir beim Verständnis geholfen.
Angesichts dieses Codes für ein 2d-Array von Zeichenfolgen ...
String[][] messages;
messages = new String[][] {
{"CAT","DOG","YIN","BLACK","HIGH","DAY"},
{"kitten","puppy","yang","white","low","night"}
};
int row = messages.length;
int col = messages[0].length;
Wenn ich meine Ints so benenne, als wäre es ein 2D-Array (Zeile, Spalte), sehen wir die Werte.
row = (int) 2
col = (int) 6
Die letzten beiden Zeilen Code, wo wir versuchen , eine Größe zu bestimmen , und setzen Sie sie auf row
und col
sieht nicht so intuitiv und es ist nicht unbedingt richtig.
Damit haben Sie hier wirklich zu tun (beachten Sie die neuen Variablennamen zur Veranschaulichung):
int numOfArraysIn = messages.length;
int numOfElementsIn0 = messages[0].length;
int numOfElementsIn1 = messages[1].length;
Wo messages.length
sagt Ihnen, messages
hält zwei Arrays. Ein Array von Arrays.
AND messages[x].length
ergibt dann die Größe jedes einzelnen Arrays im 0
1
Inneren messages
.
numOfArraysIn = (int) 2
numOfElementsIn0 = (int) 6
numOfElementsIn1 = (int) 6
Wenn wir mit einem für jede Schleife drucken ....
for (String str : messages[0])
System.out.print(str);
for (String str : messages[1])
System.out.print(str);
CATDOGYINBLACKHIGHDAYkittenpuppyyangwhitelownight
Der Versuch, die Klammern fallen zu lassen und so zu drucken, führt zu einem Fehler
for (String str : messages)
System.out.print(str);
incompatible types: String[] cannot be converted to String
Das Obige ist wichtig, um beim Einrichten von Schleifen zu verstehen, .length
mit denen der Schritt durch das Array begrenzt wird.