2 Stimmen

Ich habe geklont, aber das ursprüngliche Array ist immer noch betroffen

Ich versuche, einen 3x3-Quadrat-Verschiebungs-Puzzle-Löser in Java zu schreiben. Allerdings hänge ich bei dem Teil fest, bei dem ich die Blöcke verschiebe - mit dem Algorithmus, den ich verwendet habe, habe ich immer wieder neue leere Felder erhalten. Nach einigen Tests habe ich herausgefunden, dass es daran liegt, dass trotz meiner Verwendung des Befehls clone() das Array von v immer noch beeinflusst wird, wenn ich "current" ändere. Weiß jemand, warum das so ist und wie ich es beheben kann? Ich dachte, dass ich nach der Verwendung von clone das neue Array ändern könnte, ohne das alte zu beeinflussen.

    if (!rightwall)
    {
        int[][] current = v.state.clone();
        current[x][y] = current[x][y + 1];
        current[x][y + 1] = 0;
        State w = new State(current);
        w.distance = v.distance + 1;
        w.path = v;
        System.out.println("Right Shift:");
        w.print();
        q.insert(w);
    }

State ist eine Klasse, die ein zweidimensionales Array zusammen mit einigen Eigenschaften darstellt - der erste Teil des Codes für State lautet

public class State {
int[][] state = new int[3][3];
int distance = 0;
boolean known = false;
State path = null;
State(int[][] newstate){
    state = newstate.clone();
}

v ist der Zustand, der die aktuelle Position repräsentiert. w wäre dann eine "benachbarte" Position, die nach dem Tausch des leeren Raums mit dem daneben liegenden Raum entsteht.

q ist eine Warteschlange.

0 Stimmen

Was ist v ? Was ist State ? Was ist q ? Dieser Code hat ohne diesen Kontext keine Bedeutung.

8voto

勿绮语 Punkte 8962

In Ihrer State-Klasse müssen Sie dafür sorgen, dass alle Eigenschaften tief kopiert werden.

0 Stimmen

Wie kann ich das tun? Der Code ist public class State { int[][] state = new int[3][3]; int distance = 0; boolean known = false; State path = null; State(int[][] newstate){ state = newstate.clone(); }

0 Stimmen

Sollten Sie eigentlich eine neue Instanz des Arrays in Ihrem Konstruktor erstellen und dann das Array von der Quelle zum Ziel kopieren

0 Stimmen

Sie haben gerade das Array der Arrays geklont. Das bedeutet, dass Sie ein neues äußeres Array haben, das Verweise auf die gleichen inneren Arrays wie das alte äußere Array enthält. Sie sollten auch alle inneren Arrays klonen. Siehe stackoverflow.com/questions/5563157/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X