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

Flexible statische Ausgabe-Methode
    // 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()));
        }
    }
Ausgabe mit obigen Beispielwerten:
===== MiniMatrix =====
 q w e r
 a s d f
 y x c v
~~~~~~~~~~~~~~~~~~~~~~
Ausgabe mit nicht-rechteckigem Array:
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;
    }