Wie kann man sich beim Erstellen eines 2D-Arrays daran erinnern, ob zuerst Zeilen oder Spalten angegeben werden?
java
multidimensional-array
Matt B.
quelle
quelle
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
quelle
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).
quelle
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.quelle
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.
quelle
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.
quelle
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.
quelle
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
undcol
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 im0
1
Innerenmessages
.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.quelle
In TStringGrid-Zellen steht die Eigenschaft Col an erster Stelle.
Die Zuordnung
StringGrid1.cells[2, 1] := 'abcde';
des Wertes wird also in der dritten Spalte der zweiten Zeile angezeigt.quelle