Mehrdimensionale Arrays
In Java ist es möglich, 2-dimensionale und auch höherdimensionale Arrays zu erstellen.
Im Prinzip ist ein 2-dimensionales Array ein 1-dimensionales, dessen Elemente wiederum ein 1-dimensionales Array (des gewünschten Datentyps) sind. Das lässt sich analog für 3 oder mehr Dimensionen erweitern.
Damit können auch "nicht-rechteckige" mehrdimensionale Arrays erstellt werden.
1. Erzeugung
Die Erstellung eines "rechteckigen" 2-dimensionalen Char-Arrays erfolgt so:
-
Deklaration:
char[][] miniMatrix;
-
Instanzierung: miniMatrix = new char[2][3]; // standardmäßig mit 0-Werten gefüllt
-
Initialisierung: Verschachtelte Schleife, jede Zelle:
miniMatrix[i][k] = '.';
public class Arr2dim
{
private char[][] raster; // Deklaration
public Arr2dim(int hoehe, int breite) {
if (hoehe < 1) {
System.out.format("ERR in Arr2dim - hoehe < 1: %d", hoehe);
}
raster = new char[hoehe][breite]; // Instanzierung (Erzeugung)
for (int i = 0; i < hoehe; i++) { // Initialisierung (hier mit '.')
for (int k = 0; k < breite; k++) {
raster[i][k] = '.';
}
}
}
// ...
}
2. Interaktive Wert-Eingebe
Hier eine weitere Methode für obige Klasse, die mit 'Scanner' interaktives Einlesen von Werten erlaubt (Format zeile/spalte/wert
, z.B.: 2/0/#
)
Methode enthält nur unzureichende Eingabe-Prüfungen!
public void inputZellWert() {
int hoehe = raster.length;
int breite = raster[0].length;
Scanner sc = new Scanner(System.in);
System.out.format("Eingabe zeile(int<%d)/spalte(int<%d)/wert(char): ", hoehe, breite);
String input = sc.next();
System.out.format("eingegeben: '%s'", input);
String[] teile = input.split("/");
int zeile = Integer.parseInt(teile[0]);
int spalte = Integer.parseInt(teile[1]);
if (teile[2].length() != 1) {
System.out.format("ERR: kein Einzelzeichen als Wert: '%s'", teile[2]);
} else {
char wert = teile[2].charAt(0);
raster[zeile][spalte] = wert;
}
}
3. Bildschirm-Ausgabe
// Bsp.: print2DimCharArr("MiniMatrix", " %c",
// {{'q', 'w', 'e', 'r'}, {'a', 's', 'd', 'f', 'g'}, {'x', 'c', 'v'}});
public static void print2DimCharArr(String title, String cellFmt, char[][] arr2d) {
if (title != null) {
System.out.format("===== %s =====%n", title);
}
for (int i = 0; i < arr2d.length; i++) {
for (int k = 0; k < arr2d[i].length; k++) {
System.out.format(cellFmt, arr2d[i][k]);
}
System.out.println();
}
if (title != null) {
System.out.println("~".repeat(12 + title.length()));
}
}
===== MiniMatrix ===== q w e r a s d f y x c v ~~~~~~~~~~~~~~~~~~~~~~
Aufruf in BlueJ mit Parametern "Nicht-Rechteck", " %c", {{'q', 'w', 'e', 'r'}, {'a', 's', 'd', 'f', 'g'}, {'x', 'c', 'v'}} liefert: ===== Nicht-Rechteck ===== q w e r a s d f g x c v ~~~~~~~~~~~~~~~~~~~~~~~~~~
Ausgabe mit erstem Index nach oben steigend (z.B. f. Diagramme):
-
Getter für gesamtes Array (um statische Methoden mit "raster" als Parameter verwenden zu können)
-
Hilfsmethode für "Umdrehen": flipY
-
Modifizierte Ausgabemethode, die
flipY
zur Adaption der ersten Dimension verwendet
public char[][] getRaster() {
return this.raster;
}
public static int flipY(int iY, int lenY) { // lenY ... 'hoehe'
return lenY - iY - 1;
}
public static void printYaxisUp(String cellFmt, char[][] arr2d) {
for (int i = 0; i < arr2d.length; i++) {
for (int k = 0; k < arr2d[i].length; k++) {
int iY = flipY(i, arr2d.length);
System.out.format(cellFmt, arr2d[iY][k]);
}
System.out.println();
}
}
Zur Nutzung in BlueJ ist zuerst ein Arr2dim
-Objekt (name z.B. arr2dim1) zu instanzieren (sinnvolle Parameter-Werte: hoehe=20
, breite=30
), darin mit dem unten gezeigten gerade(..)
eine oder mehrere Gerade zeichnen (z.B. 45° durch Ursprung: k=1, d=0).
Nun kann mit arr2dim1.getRaster()
das Array erhalten werden. Genau dieser Aufruf wird als 2.Parameter für z.B. printYaxisUp(" %c", arr2dim1.getRaster())
verwendet werden, womit eine korrekt aussehende Darstellung der Geraden entsteht.
4. Einige weitere Operationen
Primitive Implementation für "Gerade" mit starken Einschränkungen v.a. für Steigungen wg. int
-Param:
// Geradengleichung: y = kx+d: kein Winkel zw. k=1 (45°) ind k=0 (0°) bei int-Param!
public void gerade(int k, int d, char ch) {
for (int ix = 0; ix < raster[0].length; ix++) {
int iy = k*ix + d;
if (iy >= 0 && iy < raster.length) {
raster[iy][ix] = ch;
}
}
printRaster(String.format("Gerade für k=%d, d=%d", k, d));
}
Source-Code für eine Methode zur Füllung des gesamten Rasters mit zyklisch fortlaufenden Großbuchstaben des Alphabets (Nach 'Z' folgt wieder 'A'), weiters Methoden für Ausgabe des String-Wertes, der durch Zusammenfügen über alle Zellen eines übergebenen Index-Wertes der "ersten" oder "zweiten" Dimension entsteht:
public void fillWithAlphabet() {
char ch = 'A';
for (int i = 0; i < raster.length; i++) {
for (int k = 0; k < raster[i].length; k++) {
raster[i][k] = ch;
ch = (ch == 'Z' ? ('A') : (char)(ch+1));
}
}
}
public String textForDim1Idx(int idx) { // in Zeilen/Spalten-Logik: Zeile fixiert -> waagrecht
String txt = "";
for (int k = 0; k < raster[idx].length; k++) {
txt += raster[idx][k];
}
return txt;
}
public String textForDim2Idx(int idx) { // in Zeilen/Spalten-Logik: Spalte fixiert -> senkrecht
String txt = "";
for (int j = 0; j < raster.length; j++) {
txt += raster[j][idx];
}
return txt;
}