Java Objektreferenz aufheben

Von: , 04.01.2012 19:13 Uhr

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 ^^)

13 Antworten zu dieser Frage

  1. Antwort von nach 8 Minuten 0 hilfreich
    Re: Java Objektreferenz aufheben

    Schau dir mal System.arrayCopy und Arrays.copy an

  2. Antwort von nach 39 Minuten 0 hilfreich
    Re: Java Objektreferenz aufheben

    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

  3. Antwort von nach 2 Stunden 0 hilfreich
    Re: Java Objektreferenz aufheben

    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

    • Antwort von nach 15 Stunden 0 hilfreich
      Re^2: Java Objektreferenz aufheben

      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<4;c1++){
      for (int c2=0;c2<4;c2++){
      temp[c1][c2]=pattern[c1][c2];
      }
      }

      spuckte mir Java den Hinweis aus, dass es eine manuelle array copy ist. Und hat mir folgendes vorgeschlagen.

      for (int c1=0;c1<4;c1++){
      System.arraycopy(pattern[c1], 0, temp[c1], 0, 4);
      }

      vielleicht geht es noch besser, aber das wäre mir zu viel Aufwand, das jetzt herauszufinden. Und nochmal danke an alle ^^

      • Antwort von nach 16 Stunden 0 hilfreich
        Re^3: Java Objektreferenz aufheben

        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 < MAX; ++i) {
        for (int j = 0; j < MAX; ++j) {
        temp[MAX - 1 - j][i] = pattern[i][j];
        }
        }
        

        Ü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

        • Antwort von nach einem Tag 0 hilfreich
          Re^4: Java Objektreferenz aufheben

          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 :D
          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. ^^

          • Antwort von nach einem Tag 0 hilfreich
            Re^5: Java Objektreferenz aufheben

            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

      • Antwort von nach 2 Stunden 0 hilfreich
        Re: Java Objektreferenz aufheben

        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

  4. Antwort von nach 2 Stunden 0 hilfreich
    Re: Java Objektreferenz aufheben

    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

  5. Antwort von nach 2 Stunden 0 hilfreich
    Re: Java Objektreferenz aufheben

    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

  6. Antwort von nach 13 Stunden 0 hilfreich
    Re: Java Objektreferenz aufheben

    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

    • Antwort von nach 19 Stunden 0 hilfreich
      Re: Java Objektreferenz aufheben

      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

      • Antwort von nach einem Tag 0 hilfreich
        Re^2: Java Objektreferenz aufheben

        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 ^^

        Jetzt auf diese Frage antworten.