Frage

Ich habe einige als ArrayList gespeicherten Daten. Und wenn ich ein Backup dieser Daten wollen, java begrenze zwei Objekte für immer. Das bedeutet, wenn ich Werte in Daten ArrayList ändern, um diese Änderungen zu sichern kommen. Ich habe versucht, Werte von den Daten in der Schleife getrennt Backup zu kopieren, versuchte Methode data.clone() zu verwenden -. Nichts hilft

War es hilfreich?

Lösung

Ich glaube, Sie die einzelnen Objekte .clone() benötigen. die ArrayList Klonen ist nicht „tief“; es werden nur die Verweise auf das Objekt klonen.

Andere Tipps

Ihre Frage ist nicht ganz klar. Wenn Sie () eine Arraylist klonen, wird nicht der Klon geändert werden, wenn Sie den Inhalt des Originals zu ändern (dh, wenn Sie Elemente hinzufügen oder entfernen), aber es ist eine „flache Kopie“ so, wenn Sie die tatsächlichen Objekte im Original ändern werden sie auch im Klon geändert werden.

Wenn Sie eine „tiefe Kopie“ machen wollen, so dass Änderungen an den eigentlichen Objekten werden nicht die Backups von ihnen in dem Klon beeinflussen, dann müssen Sie eine neue Arraylist erstellen und dann das Original durchlaufen und für jede Element, klonen es in den neuen. Wie in

ArrayList backup = new ArrayList();
for (Object obj : data)
   backup.add(obj.clone());

Ich gehe davon aus data ist der Name des ArrayList Sie sichern wollten. Wenn ja, sollten Sie wissen, dass clone ist nicht tief - es schafft nur eine Kopie des Objekts, auf dem sie aufgerufen wird, die in diesem Fall die Liste ist. Wenn es ein tiefer Klon wäre, würde es die neue Liste mit den Klonen der Objekte darin füllen.

Da es nicht tief ist, wenn Sie die Objekte enthält die Liste ändern, dann ist die Backup-Liste wird diese Änderungen auch zeigen, da sie die gleichen Objekte enthalten sind. Das einzige Mal, Sie werden keine Änderungen in der Sicherung sehen, nachdem die „aktuelle“ Liste zu ändern ist, wenn Sie Objekte aus der aktuellen Liste hinzuzufügen oder zu entfernen.

Einige Klassen können clone außer Kraft setzen tief zu sein, aber nicht alle. Im Allgemeinen ist es nicht etwas, das Sie sich verlassen können. Wenn Sie eine Sicherungskopie von Java Sammlungen zu schaffen, denken Sie daran, auch die enthaltenen Objekte entweder klonen oder nur mit Sammlungen von unveränderlichen Objekten befassen.

Alle diese Prozesse machen flache Kopien. Wenn Sie Eigenschaften von Objekten mit in der Anordnung zu ändern, die beiden Arrays haben Verweise auf die gleiche Instanz.

List org = new java.util.ArrayList();
org.add(instance)
org.get(0).setValue("org val");
List copy = new java.util.ArrayList(org);
org.get(0).setValue("new val");

copy.get(0).getValue() kehrt "new val" auch weil org.get(0) und copy.get(0) genau die gleiche Instanz zurück. Sie haben eine tiefe Kopie ausführen wie folgt:

List copy = new java.util.ArrayList();
for(Instance obj : org) {
    copy.add(new Instance(obj)); // call to copy constructor
}

Hängt was Sie brauchen. Flache Kopie (Objekte in der Liste sind Verweise auf die gleiche wie im Original):

ArrayList backup = new ArrayList(mylist.size());
backup.addAll(mylist);

Deep Kopie (Artikel sind Kopien auch):

ArrayList backup = new ArrayList(mylist.size());
for(Object o : mylist) {
    backup.add(o.clone());
}

Es klingt (wenn ich Ihre Frage richtig interpretieren, es ist ein wenig hart ist), wie Sie nicht das Kopieren der Daten, die Sie auf Ihre Sicherung in Ihrem Arraylist sich beziehen; Sie kopieren die Referenz.

Es ist schwer, genau zu sagen, wie Ihr Problem zu lösen, ohne Ihr Datentyp zu wissen, was ist, dass Sie speichern / sichern, aber nur sicher sein, dass Sie die Elemente der Daten innerhalb der Arraylist enthalten sind kopieren. Das würde bedeuten, unter anderem, um die Dinge zu tun wie einen Klon durchführen () auf den Elementen der Liste, aber nicht auf dem Arraylist (denn das ist eine neue geklonte Liste mit Kopien der Verweise auf die gleichen Objekte erstellen werden).

In Bezug auf das Klonen Problem einmal gelöst ich das durch die gesamte Kollektion in einen String dann Serialisierung es zurück in ein neues Objekt Serialisierung. Dies zwingt Sie alle Ihre Objekte serialisierbar zu machen und nehmen, wenn zwei Objekte wirklich ein einzelnes drittes Ziel wollen verweisen, aber es kann eine ziemlich gute Balance von Einfachheit und Nützlichkeit sein.

Eigentlich habe ich nicht versucht, aber man könnte wahrscheinlich ein Rohr verwenden und aus exakt zur selben Zeit serialisiert, so dass Sie nicht mehr als 3 Kopien im Speicher zu speichern (wenn es eine riesige Sammlung)

Hier ist eine volle Arraylist Backup-Klasse funktioniert, die, wenn die Arraylist prüft bereits vorhanden ist. Im Grunde ist es nur ein for-Schleife durch die Liste Radfahren und manuell in die neuen Liste hinzugefügt wird.

import java.util.ArrayList;

public class Snapshot {
    private ArrayList<Integer> dataBackup;

    public Snapshot(ArrayList<Integer> data)
    {
        dataBackup = new ArrayList<Integer>();
        for(int i = 0; i < data.size(); i++)
        {
            dataBackup.add(data.get(i));
        }
    }

    public ArrayList<Integer> restore()
    {
        return dataBackup;
    }

    public static void main(String[] args)
    {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);

        Snapshot snap = new Snapshot(list);

        list.set(0, 3);
        list = snap.restore();

        System.out.println(list); // Should output [1, 2]

        list.add(4);
        list = snap.restore();

        System.out.println(list); // Should output [1, 2]
    }
}

Ich habe es noch nicht ausprobiert, aber ich denke, Collections.copy wird das tun.

[EDIT] Jetzt habe ich versucht:

static String GetRandomString(int length)
{
  UUID uuid = UUID.randomUUID();
  return uuid.toString().substring(0, length);  
}

public static void main(String[] args)
{
  ArrayList<String> al = new ArrayList<String>(20);
  for (int i = 0; i < 10; i++)
  {
    al.add(GetRandomString(7));
  }
  ArrayList<String> cloneArray = new ArrayList<String>(al);
  Collections.copy(cloneArray, al);
  System.out.println(al);
  System.out.println(cloneArray);
  for (int i = 9; i >= 0; i -= 2)
  {
    al.remove(i);
  }
  System.out.println(al);
  System.out.println(cloneArray);
}

Sie können ein Objekt schreiben, die zwei Arraylisten wickelt. Alles, was schreiben, so dass es fügt hinzu, entfernt und modifiziert Daten in beide zur gleichen Zeit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top