Java Objektreferenz aufheben

War am Programmieren bis sich bei mir ein Fehler eingeschlichen hat.
Ich hab ne Klasse die das folgende Attribut hat

private boolean[][] pattern;

ist 4*4 großes Array. Nun wollte ich es um 90° nach links drehen. Dafür brauche ich ne kopie habe also in meine Methode folgendes geschrieben

boolean[][] temp=pattern;

leider habe ich dann herausgefunden, dass ich nur eine Referenz bilde, aber „temp“ darf sich nicht verändern
gibt es einen Befehl mit dem Java sagen kann, dass er ein Eigenständiges Objekt bildet. Oder muss ich wirklich jeden Wert mit 2 Schleifen kopieren.
Ich muss soviel wie möglich Rechenzeit sparen, da das ganze in echtzeit laufen soll. (Wird natürlich später mit C++ laufen, nur muss ich mir dafür noch einiges einrichten ^^)

Schau dir mal System.arrayCopy und Arrays.copy an

Einfach
temp = pattern.clone() ;
Verwenden.

Clone fertigt eine Kopie des Objects an.
Bin mir aus dem Kopf nicht sicher, ob die Syntax stimmt.
Sollte aber so gehen, wenn ich nicht irre.

Mit freundlichen Grüßen / Best regards
Ingo Fick

Hallo P0nysl4station,

Die Klasse java.lang.Object bietet hierfür die Methode clone() an. Da alle Klassen von Object erben, kannst du clone() auf alle Arrays anwenden.

Um pattern in temp zu kopieren, schreibe also:

temp = pattern.clone();

Ich hoffe, das hilft dir. Wenn nicht, schreibe mich gerne nochmal an.

Viele Grüße

tincian

Unsinn, ich habe mich verlesen. Das clone() kopiert ebenfalls nur eine Referenz. Entschuldigung.

So ist es richtig:

int quelle[] = { 1, 2, 3, 4, 5, 6 };
int ziel[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };

//kopiere alle Elemente des Array quelle in das Array
//ziel, beginnend bei Index 0
System.arraycopy(quelle,0, ziel, 0, quelle.length);

http://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/661…

Es gibt die Methode

 Object Object.clone()

mit der theoretisch eine Kopie erzeugt wird, aber ob die für Arrays definiert ist, weiß ich nicht. Zum Kopieren von Arrays benutzt du in Java

 static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

damit geht es so schnell wie in Assembler.

Für deinen Zweck brauchst du ja aber keine Kopie, sondern eine Variante deines Ursprungs-Arrays. Die muss du schon mit zwei in einander geschachtelten Schleifen bauen.

Tosta

Hallo,
entweder du versuchst das mit einem eindimensionalen Array zu lösen und verwendest bequem
System.arraycopy
oder du musst dir was basteln.
Schau mal hier:
http://www.java-forum.org/java-basics-anfaenger-them…

Und gibt noch mehr via Google zu finden.

Torsten

Hallo,

noch mal was anderes.
Wie wäre es, wenn du für statt der Variable/Member pattern eine neue Klasse erstellst, welche nur das Member pattern hat.
In der Klasse die du schon hast erzeugst du dann ein Objekt der neuen Klasse.
Und dieses Objekt sollte sich dann doch eigentlich via clone() klonen lassen.

Probieren geht über studieren. Sollte aber auf jeden Fall performant genug sein.

Torsten

Und da aller guten Dinge drei sind und ich schon müde bin habe ich doch noch was gefunden.
clone() lässt sich direkt auf Arrays verwenden.

Guckst du hier
http://openbook.galileocomputing.de/javainsel/javain…

Torsten

Hi

Mit der Methode clone() kann man das Array kopieren, wobei nur das Array Objekt kopiert wird, die Objektreferenzen im Array sind dieselben.

Ansonsten vielleicht mal bei den Apache Commons libraries schauen, die bieten häufig für solche allgemeinen Probleme gute Lösungen.

Viele Grüße,
Alain

Ok, hab mich nach erfolglosem Rumbasteln, dann doch für die manuelle Methode entschieden.
War dann aber doch interessant zu sehen, was Java daraus gemacht hat.
Nach folgendem Quellcode

for (int c1=0;c1

Hi,

hat dich meine Antwort nicht erreicht? (Ich hatte auch schon auf System.arraycopy() hingewiesen.)

System.arraycopy() ist das Optimum. Aber ich meine, du wolltest das Array nicht einfach nur kopieren, sondern um 90° drehen? Dann hilft dir System.arraycopy() nicht, sondern du musst jedes Array-Element einzeln anpacken:

 final int MAX = 4;
 // Array um 90 Grad nach links drehen:
 for (int i = 0; i 
Überleg aber auch mal, ob du diese gedrehte Kopie des Array überhaupt brauchst, oder ob du nicht einfach mit "verdrehten" Indexen direkt auf das Original-Array zugreifen kannst.

Tosta

Kurzantwort:

http://dpunkt.de/java/Die_Sprache_Java/Objektorienti…

Warum wird das erst in Java implementiert, wenn es später in C++ laufen soll?

es tut mir leid, aber ich beschäftige mich schon länger nicht mehr mit Java.
Ich vermute dass ein neues Objekt neu definiert werden muss.
Selbst wenn: die Umwandlung der Referenz würde vermutlich mehr Zeit verbrauchen.

Hallo P0nysl4ystation,

in Jave werden nicht Primitive Datentypen immer per Referenz kopiert. Wenn Du eine sogenannte tiefe Kopie brauchst, musst Du das explizit implementieren. Mehr zum Thema tiefe und flache Kopien in Java findest Du unter:
Java Buch oder
Java Array Tutorial).

Wenn Du auf Effizienz achten willst, dann kannst Du anstatt den Array erst zu kopieren und dann deine Berechnung darauf zu machen. Die Berechnung mit dem alten Array machen und die Ergebnisse anstatt auf den alten in den neuen Array zu schreiben. Ist auf jeden deutlich effizienter.

Wenn das Ganze in Echtzeit laufen soll, dann würde ich dir allerdings gleich dazu raten es in C++ zu schreiben. Es erst in Java zu schreiben und dann nach C++ zu übersetzen ist aufwendig und fehleranfällig, da sich die beiden Sprechen doch deutlich unterscheiden.

Hoffe das hilft Dir weiter.
Mag

Ja das habe ich schon davor implementiert. hat zwar auch paar minuten gedauert bis ich auf den Algorithmus gekommen bin, aber dann brauch ich den wenigstens nicht mehr nachvollziehen :smiley:
Hab jetzt zuerst das array kopiert und dann das original gedreht überschrieben.
Mir ist auch kein weg,wie bei der Punktspiegelung, eingefallen, so dass ich nur ein temp boolean brauche.

Also es funzt jetzt. ^^

Weil ich im Moment noch keine C++ Entwicklungsumgebung habe. Und nicht irgendeine nehmen will, sondern die von unserem Institut und ich dafür erst mal an die Uni muss :smiley:

Danke für die Antwort.

Zum 2. Abschnitt.
Mein Array ist ja ein Attribut der Klasse, das zuerst eingelesen wird und dann muss es ja verändert werden.
Ok ich könnte auch direkt beim Einlesen den ganzen Vorgang machen, jedoch weiß ich noch nicht was für Schritte davor kommen und das alles noch bissl komplizierter wird ^^

Ich würde es ja schon in C++ schreiben, jedoch fehlt mir noch ne Entwicklungsumgebung und ich werde eine vom Institut bekommen. Liegt alles an Silvester und Weihnachten ^^

Hab jetzt zuerst das array kopiert und dann das original
gedreht überschrieben.

Aber wenn dir doch so viel an Performanz liegt, warum schreibst du das Array zweimal: erstens beim Kopieren und zweitens beim Drehen? Dreh doch direkt beim Kopieren!

Optimierung ist mit Vorsicht zu genießen, aber Pessimierung muss doch nicht sein!

Tosta