Array einem Array zuweisen

Status
Nicht offen für weitere Antworten.

tapioca

Mitglied
hi zusammen!

ich möchte gerne ein (boolean) 2D-Array einem anderen (boolean) 2D-Array zuweisen.
Hintergedanke dabei ist, dass ich auf dem Array "fields" Abfragen mache, im Genaueren untersuche ich die Nachbarn auf true oder false eines jeden Elementes. Im Zusammenhang mit bestimmten Regeln setze ich dann das untersuchte Element selber auf true oder false. Dazu muss ich aber dieses newFields Array extra anlegen, damit ich mir das alte Array zum Vergleichen merken kann.
Dabei hab ich's fehlerhafter Weise am Anfang einfach mit newFields=fields versucht, wobei aber wohl nur der Pointer newFields auf das Array fields zeigt. Was heißt, wenn ich newFields verändere, verändert sich am Ende auch fields, was ich ja nicht möchte.
Dann hab ich's mit folgender Methode versucht, ich geh also jedes einzelne Element durch und weise es einzeln dem anderen zu. Ist dies so richtig, weil am Ende bekomme ich doch einen Fehler heraus? Die Zuweisung sieht folgendermaßen aus:
Code:
 for (int i = 0; i < fields.length; i++) {
            for (int j = 0; j < fields[0].length; j++) {
                newFields[i][j] = fields[i][j];
            }
        }

Die gesamte Methode sieht so aus, zwischen Zeile 11 und 98 passiert nicht viel, es werden nur die Nachbartypen bestimmt:
Code:
//hiermit zähle ich die nachbarn
int neighbourCounter;

//zuweisen des "Merke-Arrays"
        for (int i = 0; i < fields.length; i++) {
            for (int j = 0; j < fields[0].length; j++) {
                newFields[i][j] = fields[i][j];
            }
        }
//das gemerkte Array durchlaufen und Ecken, Ränder und Innenfeld durchgehen
        for (int i = 0; i < fields.length; i++) {
            for (int j = 0; j < fields[0].length; j++) {
                neighbourCounter = 0;
//                (0;0)
                if (i == 0 && j == 0) {
                    for (int k = i; k < i + 2; k++) {
                        for (int l = j; l < j + 2; l++) {
                            if (fields[l][k]) {
                                neighbourCounter++;
                            }
                        }
                    }
                //                (0;y)
                } else if (i == 0 && j == fields[0].length - 1) {
                    for (int k = i; k < i + 2; k++) {
                        for (int l = j - 1; l < j + 1; l++) {
                            if (fields[l][k]) {
                                neighbourCounter++;
                            }
                        }
                    }
                //                (x;0)
                } else if (i == fields.length - 1 && j == 0) {
                    for (int k = i - 1; k < i + 1; k++) {
                        for (int l = j; l < j + 2; l++) {
                            if (fields[l][k]) {
                                neighbourCounter++;
                            }
                        }
                    }
                //                (x;y)
                } else if (i == fields.length - 1 && j == fields[0].length - 1) {
                    for (int k = i - 1; k < i; k++) {
                        for (int l = j - 1; l < j; l++) {
                            if (fields[l][k]) {
                                neighbourCounter++;
                            }
                        }
                    }
                //                raender
                } else if (i == 0) {
                    for (int k = i; k < i + 2; k++) {
                        for (int l = j - 1; l < j + 2; l++) {
                            if (fields[l][k]) {
                                neighbourCounter++;
                            }
                        }
                    }
                } else if (j == 0) {
                    for (int k = i - 1; k < i + 2; k++) {
                        for (int l = j; l < j + 2; l++) {
                            if (fields[l][k]) {
                                neighbourCounter++;
                            }
                        }
                    }
                } else if (i == fields.length - 1) {
                    for (int k = i - 1; k < i; k++) {
                        for (int l = j - 1; l < j + 1; l++) {
                            if (fields[l][k]) {
                                neighbourCounter++;
                            }
                        }
                    }
                } else if (j == fields[0].length - 1) {
                    for (int k = i - 1; k < i + 1; k++) {
                        for (int l = j - 1; l < j; l++) {
                            if (fields[l][k]) {
                                neighbourCounter++;
                            }
                        }
                    }
                } //                    innenfeld
                else {
                    for (int k = i - 1; k < i + 1; k++) {
                        for (int l = j - 1; l < j + 1; l++) {
                            if (fields[k][l]) {
                                if (fields[l][k]) {
                                    neighbourCounter++;
                                }
                            }
                        }
                    }
                }


           
                if (fields[i][j]) {
//da beim Arraydurchlauf das Element selber auch mitgezählt wird, muss es abgezogen werden, wenn es true ist
    neighbourCounter--;
                    newFields[i][j] = neighbourCounter == ue ? true : false;
                } else {
                    newFields[i][j] = neighbourCounter == g ? true : false;
                }
            }

        }
// das Array wieder zurückzuweisen
        for (int i = 0; i < fields.length; i++) {
            for (int j = 0; j < fields[0].length; j++) {
                fields[i][j] = newFields[i][j];
            }
        }

in Zeile 99 taucht der Fehler auf, wenn ich das Programm mit bestimmter true false Belegung durchlaufen lasse, zieht er einmal neighbourCounter-- ab, obwohl das fields-Element false sein sollte. Ich schließe darauf, dass die Zuweisung wieder nur durch Pointerarythmetik geschehen ist und kein neues Feld angelegt wurde, weil im neuberechneten (newFields) Array dieses Element tatsächlich auf true steht, obwohl ich doch fields abfragen möchte.
Die Arrays werden natürlich folgendermaßen deklariert:
boolean[][] fields, newFields;
fields = new boolean[x][y];
newFields = new boolean[x][y];
 

hdi

Top Contributor
Ist das 2d-Array quadratisch? Wenn nicht, musst du

Code:
for (int j = 0; j < fields[0].length; j++) {
immer durch

Code:
for (int j = 0; j < fields[i].length; j++) {

ersetzen.

Ansonsten wäre es mal gut, wenn du eine kleine Sys-out printmeldung in jeden if-Block reinschreibst,
mit sinnvollem Kommentar. So dass du anhand eines Beispiels dann genau siehst, WO hier ein Wert, der eigentlich
false sein sollte, als true angesehen wird.
 

Marco13

Top Contributor
Ansonsten ist EVTL nicht entscheidend, wie du da irgendwelche (wie du selbst gesagt hast) vollkommen irrelevanten (und IMHO unhübschen) Berechnungen machst, sondern eher, wie du die beiden Arrays erstellst...
 
G

Guest

Gast
danke für eure hilfe, ich hab mitlerweile wohl die lösung.

das erstellen der Arrays war schon korrekt, aber ich hab Missverstanden, wie die arrays durchlaufen werden, bzw. ich hab bei den Abfragen zudem noch l und k vertauscht. Ich hab die ganze Zeit gedacht, das Array läuft erst durch jedes Zeilenelement und wechselt dann die Spalte, aber es ist genau umgekehrt. Darin lag dann mein Fehler.

Zu der Sache mit dem quadratischen 2D-Array: ist das nicht egal? Das Array ist zwar nur rechteckig, aber das heißt ja im Endeffekt, dass jedes fields.length gleichgroß ist. Eine Rolle würde das doch nur spielen, wenn das Array quasi pyramidisch (also: erste Zelle zeigt auf Array mit einer Zelle, zweite Zelle zeigt auf Array mit zwei Zellen, usw.) oder anders asymmetrisch wäre.

zu Marco: wie könnte man die Abfragen schöner erstellen? hab schon versucht zu kürzen, aber eleganter seh ich's gerade nicht.
 
S

SlaterB

Gast
was genau passiert in 11-98?
werden da lediglich die 8 bzw. 9 ArrayFelder um ein Feld herum geprüft?
deine Indexe in den for-Schleifen verwirren mich etwas,
im letzten else, also im Fall 'innenfeld', werden beispielweise gerade mal 4 Felder geprüft statt 9

man könnte das etwas vereinfachen wenn man sich 4 Variablen definiert
minX, maxX, minY, maxY

danach 4x if,
if (zeile 0)
if (zeile ende)
if (spalte 0)
if (spalte ende)
und jeweils die Werte anpassen, beispielsweise bei Spalte 0 minY erhöhen oder ähnliches,
vier einzelne ifs reichen, nicht Kombinationen abfragen wie
if (zeile 0 & spalte 0)
if (zeile 0 & spalte ende)

danach dann EINE doppelte for-Schleife mit den korrekten min-max-Werten

-----

noch einfacher: alle 9 umliegenden Felder mit einer doppelten for-Schleife durchlaufen, ohne auf die Grenzen zu achten,
dann aber nicht direkt das Array abfragen, sondern eine Hilfsmethode hatNachbarAnPosition(array, x,y),
die false zurückgibt, wenn die übergebene Position außerhalb des Arrays liegt,

entspricht in etwa den 4 if von oben, die man hier zu einem if zufassenfassen könnte und man spart sich auch die ganzen Variablen min/ max
 

hdi

Top Contributor
Zu der Sache mit dem quadratischen 2D-Array: ist das nicht egal?

Hast Recht, mein Fehler :oops:

Aber um mich nicht aus dieser Diskussion zurückzuziehen, ohne dir geholfen zu haben:

Der Term magische Zahl (engl. magic number) bezeichnet auch den schlechten Programmier-Stil, Zahlen direkt im Quellcode zu benutzen. In vielen Fällen macht dies Programme schwerer lesbar und unverständlich. Besser kann es sein, Zahlen mit Bedeutung als Konstante zu definieren und so mit einem Namen zu versehen

...das heisst was du - rein von der Logik her - willst, ist .length durchlaufen, für jede Reihe.
Dass die Reihen alle gleichlang sind ist halt jetzt (zufällig oder nicht) so.
Deswegen solltest du das auch so hinschreiben, das Programm tut zwar das selbe, aber deine Absichten
kommen einfach besser rüber. Eine Zahl bei Array-Zugriffen ist zwar nicht wirklich eine "Magic Number",
aber es geht in die gleiche Richtung..
 

tapioca

Mitglied
kein problem hdi ;)

verstehe aber natürlich auch was du meinst, werde es also mal so machen. die abfragen hab ich soweit (korrekt) fertig (auch das innenfeld). wenn noch zeit bleibt werde ich die schleifen und abfragen noch nach den vorschlägen hier verbessern, ansonsten gilt erstmal 'never change a running system'. :D

Vielen Dank an alle!
 

tapioca

Mitglied
Nochmal als Nachtrag wie ich's jetzt (dank SlaterBs Vorschlag) gelöst habe:

Code:
 boolean hasNeighbour(int k, int l, int xmax, int ymax) {
        if (k < 0 || l < 0 || k > xmax - 1 || l > ymax - 1) {
            return false;
        } else {
            return true;
        }
    }


    public void inferNextGeneration() {
        int neighbourCounter;
        
//Gesamtes Feld durchlaufen
        for (int i = 0; i < fields.length; i++) {
            for (int j = 0; j < fields[i].length; j++) {
                neighbourCounter = 0;

//                Alle Nachbarn durchlaufen
                for (int k = i - 1; k < i + 2; k++) {
                    for (int l = j - 1; l < j + 2; l++) {
                        if (hasNeighbour(k, l, fields.length, fields[i].length) && fields[k][l]) {
                            neighbourCounter++;
                        }
                    }
                }

//                    alive
                if (fields[i][j]) {
                    neighbourCounter--;
                    for (int k = 0; k < ue.size(); k++) {
                        if (neighbourCounter == (Integer) ue.elementAt(k)) {

                            newFields[i][j] = true;
                            break;
                        } else {
                            newFields[i][j] = false;
                        }
                    }
                //                    dead
                } else {
                    for (int k = 0; k < g.size(); k++) {
                        if (neighbourCounter == (Integer) g.elementAt(k)) {
                            newFields[i][j] = true;
                            break;
                        } else {
                            newFields[i][j] = false;
                        }
                    }
                }
            }
        }
        for (int i = 0; i < fields.length; i++) {
            for (int j = 0; j < fields[i].length; j++) {
                fields[i][j] = newFields[i][j];
            }
        }
    }

ich musste das Projekt auch gleich mehrere Male re-(clean-)builden, weil ich garnicht glauben konnte, dass das so reibungslos klappt :D
Vielen Dank nochmal!
 
S

SlaterB

Gast
if (hasNeighbour(k, l, fields.length, fields.length) && fields[k][l]) {
neighbourCounter++;
}

->

if (hasNeighbour(k, l, fields) {
neighbourCounter++;
}

weniger Parameter und hasNeighbour kann gleich prüfen, ob da true im Feld drinsteht,
meinetwegen in hasNeighbourTrue umbenennen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
A Elemente in einem Array Java Basics - Anfänger-Themen 5
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
L Gridmuster in einem Array Java Basics - Anfänger-Themen 2
O Array mit einem Zeichen vergleichen Java Basics - Anfänger-Themen 1
Igig1 Wie lasse ich dir Werte in einem Array zusammenrücken? Java Basics - Anfänger-Themen 4
Igig1 Welche Werte sind als default Werte in einem Array, der als Datentyp eine Klasse hat? Java Basics - Anfänger-Themen 1
Schniffi Nur bestimmte Bilder aus einem Array auf Image Button anzeigen lassen Java Basics - Anfänger-Themen 3
B in einem Array den nächstgelegenen Wert zu einem eingabewert finden Java Basics - Anfänger-Themen 8
B Häufigkeit einzelner Zahlen in einem Array Java Basics - Anfänger-Themen 6
D Zufällige Auswahl aus einem angelegten Array? Java Basics - Anfänger-Themen 10
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
T Methode schreiben, die einem Array ein Stringelement hinzufügt, wenn dieses noch nicht enthalten ist. Java Basics - Anfänger-Themen 6
H Minimum in einem Array bestimmen Java Basics - Anfänger-Themen 7
C Größte Zahl aus einem Array ermitteln(als statische Methode) Java Basics - Anfänger-Themen 31
G Methoden Methode die aus einem Array ein Index ausgibt? Java Basics - Anfänger-Themen 2
U Muster in einem Array erkennen Java Basics - Anfänger-Themen 8
Z Char Array an zufälligen stellen mit einem "x" füllen. Java Basics - Anfänger-Themen 4
J Elemente in einem 2D-Array summieren Java Basics - Anfänger-Themen 6
J String aus einem Array entfernen Java Basics - Anfänger-Themen 10
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
P Arraylist zu einem Array bringen mit Verschachtelung Java Basics - Anfänger-Themen 11
M Ist es möglich, das größte und zweitgrößte element in einem Array mit nur einer Schleife ausfindig zu machen ? Java Basics - Anfänger-Themen 19
H Objekt aus einem Array löschen Java Basics - Anfänger-Themen 1
L Anzahl der Elemente key in einem Array mit log(N) Laufzeit Java Basics - Anfänger-Themen 4
FelixN RegEx aus einem String als String-Array zurückgeben Java Basics - Anfänger-Themen 8
B Werte aus einem Unterprogramm in ein Array schreiben Java Basics - Anfänger-Themen 2
L Nur Bestimmte Werte aus einem Array in ein anderes Speichern Java Basics - Anfänger-Themen 11
F Summe in einem Array bestimmen Java Basics - Anfänger-Themen 3
D Alle Möglichkeiten, n-Anzahl aus Elementen aus einem Array zu wählen, ausgeben? Java Basics - Anfänger-Themen 23
D Werte aus einem BinärBaum in einem Array speichern Java Basics - Anfänger-Themen 1
E Zahlen von einem Array mit zahlen von zweitem Array vergleichen Java Basics - Anfänger-Themen 27
S Schiffe versenken - Zufallszahlen in einem Array Java Basics - Anfänger-Themen 6
Dilara_K Abstand zwischen den Doppelwerten in einem Array herausfinden Java Basics - Anfänger-Themen 20
T Schauen ob eine Ziffer in einem String-Array häufiger vorkommt Java Basics - Anfänger-Themen 8
P Input/Output Bestimmte Anzahl von Werten in einem Array an Methode übergeben Java Basics - Anfänger-Themen 2
N Methoden vorherigen Wert in einem Array lieferen Java Basics - Anfänger-Themen 8
P Aus einem Array zwei Arrays machen Java Basics - Anfänger-Themen 3
D Input/Output Array in einem String mit einem Trennzeichen verbinden Java Basics - Anfänger-Themen 17
M 2 Stellen in einem Array vergleichen und bei übereinstimmen eine davon ersetzen Java Basics - Anfänger-Themen 1
V Elemente aus einem Array mit null überschreiben Java Basics - Anfänger-Themen 4
K Compiler-Fehler Durchschnitt einer Spalte in einem 2D-Array Java Basics - Anfänger-Themen 1
A .txt Datei in einem Array speichern Java Basics - Anfänger-Themen 1
H Leere Eingabe in einem array Java Basics - Anfänger-Themen 11
B seltenes Vorkommen eines Integers in einem Array Java Basics - Anfänger-Themen 13
A Frage zu einem Array Java Basics - Anfänger-Themen 14
B Methoden Element aus einem Array löschen, Rest nach vorne verschieben? Java Basics - Anfänger-Themen 4
M Bestimmen, wie oft ein Char in einem Array vorkommt Java Basics - Anfänger-Themen 2
R Anzahl von Zeichen in einem Char Array Java Basics - Anfänger-Themen 4
L Linerae Suche in einem sortierten Array Java Basics - Anfänger-Themen 2
D Alle möglichen Kombinationen in einem Array ausgeben Java Basics - Anfänger-Themen 2
Y Gleiche Arrays aus einem Array mit Objekten Java Basics - Anfänger-Themen 5
F Methoden Kontaktliste - String in einem Array suchen und ausgeben Java Basics - Anfänger-Themen 3
B Binäre Suche in einem String Array Java Basics - Anfänger-Themen 10
C Abfrage nach einem Bild im Array Java Basics - Anfänger-Themen 9
C Rekursion auf einem Array(negative werte addieren) Java Basics - Anfänger-Themen 4
W JTable mit einem JButton-Array füllen Java Basics - Anfänger-Themen 4
D SetText Ausgabe von einem Array Java Basics - Anfänger-Themen 6
F Objekte in einem Array speichern Java Basics - Anfänger-Themen 1
E Summe der "Nachbarn" eines Wertes in einem Array bestimmen Java Basics - Anfänger-Themen 8
V Zwei Array in einem kopieren Java Basics - Anfänger-Themen 3
H n Zahlen aus einem Array addieren Java Basics - Anfänger-Themen 17
V Anzahl von gleichen Werten in einem Int-Array ermitteln Java Basics - Anfänger-Themen 4
1 Minimum aller Elemente in einem Array bestimmen Java Basics - Anfänger-Themen 10
J Inhalt in einem Text-File finden und in ein Array schreiben Java Basics - Anfänger-Themen 5
A Methoden Array: ausgeben von einem Wörterbucheintrag Java Basics - Anfänger-Themen 4
J In einem Array die größte Zahl ermitteln und Faktorisieren. Java Basics - Anfänger-Themen 5
M In Testklasse einem Array Werte übergeben Java Basics - Anfänger-Themen 6
J Methoden Einzelnen Wert aus Objekt aus einem Array auslesen und danach sortieren Java Basics - Anfänger-Themen 8
S Rückgabe von einem Array Java Basics - Anfänger-Themen 7
J Speichern von Würfelwürfen in einem Array Java Basics - Anfänger-Themen 5
F Einzelne Werte aus einem Array vergleichen? Java Basics - Anfänger-Themen 8
G String einem String Array übergeben Java Basics - Anfänger-Themen 3
G Element einem Array hinzufügen Java Basics - Anfänger-Themen 7
W Elemente in einem Array nach 'oben' verschieben Java Basics - Anfänger-Themen 9
I Objekte in einem Array sortieren Java Basics - Anfänger-Themen 19
D Eine Stelle eines Char- Arrays nach dem vorkommen in einem ganzem anderem Array überprüfen Java Basics - Anfänger-Themen 20
J Einem String-Array in einer for-Schleife Strings zuweisen - Klappt nicht in einer for-Schleife Java Basics - Anfänger-Themen 5
P String Sortieren in einem Array Java Basics - Anfänger-Themen 7
D Arrays zusammenfügen und in einem Array ausgeben Java Basics - Anfänger-Themen 3
T Mehrfach auftretende Zahlen in einem Array Java Basics - Anfänger-Themen 13
N Array problem bei einem magischen Quadrats Java Basics - Anfänger-Themen 3
M eine 1 von einem 2d Array subtrahieren Java Basics - Anfänger-Themen 11
I Erste Schritte Ein Zeichen in einem Array Suchen Java Basics - Anfänger-Themen 8
C Ausgabe von einem Array Java Basics - Anfänger-Themen 5
R Aus einem 2 d array rausgreifen Java Basics - Anfänger-Themen 9
K Letzter element aus einem Array Java Basics - Anfänger-Themen 5
D Erste Schritte Warum wird bei einem Array die Länge über Length ausgegeben? Java Basics - Anfänger-Themen 6
J Alle Vorkommen eines chars in einem Array durch einen anderen char ersetzen Java Basics - Anfänger-Themen 10
P Variablen Wert vergleichen mit einem Array? Java Basics - Anfänger-Themen 13
R Teile aus einem mehrdimensionalen Array vergleichen Java Basics - Anfänger-Themen 3
B Werte aus JTextArea in einem String Array ablegen Java Basics - Anfänger-Themen 4
T OOP Objekte erzeugen und in einem Array ausgeben. Java Basics - Anfänger-Themen 2
S Zahl in einem Array farbig? Java Basics - Anfänger-Themen 6
P Array mit Zufallszahlen von einem Wuerfel Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben