2D Array in Java?

Die Frage bezieht sich auf Aufgabe 3 - (Java, Array)

1 Antwort

Also mal von vorne nach hinten ;-)

Ein 2D Array in Java lässt sich mit

char[][] data = new char[n][n];

bzw.

char[][] data = {
"*****".toCharArray(),
"* ".toCharArray(),
"*** ".toCharArray(),
"* ".toCharArray(),
"* ".toCharArray()};

initialisieren (oder man holt sich die Daten Zeile für Zeile aus dem Inputbuffer oder wie auch immer das die Aufgabe genau will, dass ist mir nicht ganz klar).

Für alles weitere ist es hilfreich eine Klasse zu erstellen:

public class ImageArray {
private int _size = 0;
private char[][] _data = null;

public ImageArray(int size, char[][] data) throws IllegalArgumentException {
_size = size;
if (_size < 5) {
throw new IllegalArgumentException();
}

if (data.length != _size) {
throw new IllegalArgumentException();
}
for (char[] a : data) {
if (a.length != _size) {
throw new IllegalArgumentException();
}
}
_data = data;
}

public void print() {
for (char[] a : _data) {
for (char c : a) {
System.out.print(c + " ");
}
System.out.println();
}
}
}

Der Konstruktor sollte hierbei überprüfen, dass die Daten Sinn ergeben, damit man das später nicht jedes mal tun muss (und wenn man das komplett weglässt knallt es irgendwann). Die print-Funktion gibt den ganzen Spaß einfach aus.

Anwenden kann man das wie folgt:

ImageArray arr = new ImageArray(5, data);
arr.print();

und man bekommt das F angezeigt.

Nun kann man die Klasse um die Transformationen erweitern, z.B. für das spiegeln entlang der vertikalen Achse. Dazu Element für Element durchgehen und entsprechend austauschen.

public ImageArray flipHorizontal() {
char[][] tmpArr = new char[_size][_size];
for(int i=0; i<_size; i++) {
for(int j=0; j<_size; j++) {
tmpArr[i][j] = _data[i][_size-j-1];
}
}
return new ImageArray(_size, tmpArr);
}

Ausgegeben werden kann es dann mit 

arr.flipHorizontal().print();

Für die horizontale Achse ist es das gleiche, nur das andere Elemente ausgetauscht werden:

tmpArr[i][j] = _data[_size-i-1][j];

Ähnlich auch für die Rotation im Uhrzeigersinn:

tmpArr[i][j] = _data[_size-j-1][i];

Jetzt könnte man das genauso für alle weiteren Transformationen machen, da Programmierer aber faul sind gibt es einen noch bequemeren Weg. Denn diese 3 Transformationen sind ausreichend um alle weiteren Transformationen durchzuführen.

Eine Rotation gegen den Uhrzeigersinn ist so durch 3 mal mit dem Uhrzeigersinn rotieren zu erreichen. Eine Spiegelung an der Hauptdiagonalen durch spiegeln an der horizontalen Achse und einer Rotation im Uhrzeigersinn (bzw spiegeln an der vertikalen Achse und Rotation gegen Uhrzeigersinn. Für die Nebendiagonale horizontale Achse und gegen Uhrzeigersinn (bzw. vertikale Achse und im Uhrzeigersinn).

Sicher ist das nicht die optimalste Lösung, aber die einfachste und die Funktionalität ist auch gegeben ;-)


naoommii 
Beitragsersteller
 22.05.2016, 14:07

Oh wow Dankeschön das hat mir echt viel weitergeholfen !

0