2D Array in Java?
Kann mir bitte jemand die Lösung zu Aufgabe 3 dazuschrieben ich bin richtig am verzweifeln mit fehlt irgendwie dieser eine Gedanke mit dem ich das lösen kann. Und ich will mein Studium deswegen nicht beenden müssen Ich bin schülerstudentin und nehm deshalb nur an einem Kurs Teil den ich dann bei meinem späteren Studium nicht mehr machen muss , dazu muss ich dieses Blatt bestehen sonst bin ich draußen. Ich weiß das viele sich denken wenn man die Lösung postet lern ich daraus nichts aber durch das durchlesen des richtigen Codes werde ich dazulernen und eine andere Lösung weiß ich grade nicht. Danke schonmal im Voraus wenn sich jemand findet der evtl die Zeit und Lust hätte das zu machen ..:)
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 ;-)
Oh wow Dankeschön das hat mir echt viel weitergeholfen !