# ArrayList<Point> in eine neue ArrayList<Point> kopieren



## Jay1980 (16. Apr 2009)

Servus,

wie mach ich das, keine Ahnung, warum das nicht will. Mit Collections habe ich auch noch keine Erfahrung aber irgendwo zwickt immer was mit dem Typen oder mit dem Ausdruck der clone-Methode.

Kann mir jemand die beiden Zeilen posten, also einmal das manuelle als for-Schleife, dass dann bei jedem Collection-Objekt ein neues zur neuen Collection added und einmal den Ausdruck mit clone(). Meine Internetrecherche liess mich auf die Methode copyTo stoßen, die fand ich aber nicht in der API - ist das was aus Java4 oder Java5 oder gar überhaupt nichts aus Java.

Danke vorab.


----------



## neonfly (17. Apr 2009)

Hier mit Strings:

```
ArrayList<String> lvListe1 = new ArrayList();
lvListe1.add("text1");
lvListe1.add("text2");
ArrayList<String> lvListe2 = new ArrayList();
for(String bvListElement : lvListe1) {
    lvListe2.add(bvListElement);
}
```

Edit(h) spricht:
Was willst du clonen?

```
ArrayList<String> lvListe1 = new ArrayList();
lvListe1.add("text1");
lvListe1.add("text2");
ArrayList<String> lvListe2 = new ArrayList();
lvListe2 = lvListe1;
```


----------



## diggaa1984 (17. Apr 2009)

die Frage ist: willst du die selben Objekte in der neuen ArrayList haben, oder echte Klone davon!? Bei Strings mag das mit der for-schleife gehen, aber bei komplexeren Sachen gehts in die Hose. Das Clone selbst ist auch nur ne "shallow-copy" .. also nix was dir bei hochkomplexen Datenstrukturen weiterhilft, da müsstest dir selbst das alles bis ins detail klonen um an Ende ne echte Kopie zu erhalten


----------



## Jay1980 (17. Apr 2009)

Ich will die Punkte (ArrayList, der Objekte des Typs 'Point' fasst) klonen, also mir reichen da flache Kopien völlig, was anderes will ich gar nicht. Also ich mache das nun mal mit dem clone. Danke für die Mühen.


----------



## Marco13 (17. Apr 2009)

clone? lvListe2 = lvListe1; ? *Auf den Kalender Guckt* Ja, April, aber... :noe:

List<Point> other = new ArrayList<Point>(firstOne);

!?


----------



## 0x7F800000 (17. Apr 2009)

Nja... :noe: Da solltest du aber zunächst selbst wissen, was du willst. 
Hier sind 3 verschiedene Tiefen, wie man die Listen "kopieren kann"

Gegeben:

```
ArrayList<Whatever> a= .../*irgendwie konstruieren und befüllen*/
```

1) Stufe: referenz auf die Liste kopieren

```
ArrayList<Whatever> b=a;
```
hier wird die referenz auf die Liste, die in a gespeichert ist, einfach in b kopiert.
Ab da sind a und b praktisch austauschbar: alle manipulationen die du mit a machst, kannst du genausogut mit b machen, weil sie beide auf dasselbe Objekt zeigen.

2)Stufe: "shallow copy"

```
// (i) variante
ArrayList<Whatever> b=new ArrayList<Whatever>(a.size());
for(Whatever w:a) b.add(w);

// (ii) variante
ArrayList<Whatever> b=new ArrayList<Whatever>(a);

// (iii) variante
ArrayList<Whatever> b=a.clone(); //evtl ein cast dranhängen, wenn der typ nicht überschrieben wurde...
```
Alle drei varianten tun dasselbe. Sie erzeugen eine neue Liste, die die*selben* elemente wie a enthält. Wenn du danach aus a irgendwas löschst, oder zu b irgendwas hinzufügst, hat das auf das jeweils andere ArrayList keinerlei auswirkungen.

Wenn du aber zB. aus der Liste b ein Element rausgreifst, und den manipulierst, dann ist diese Änderung natürlich auch von a sichtbar, weil a ja die*selben* elemente referenziert.

3) Stufe: tiefe Kopie

```
ArrayList<Whatever> b=new ArrayList<Whatever>(a.size());
for(Whatever w:a){
   // (i) copykonstruktor, falls ein solcher zur verfügung steht
   b.add(new Whatever(w));
   // (ii) clone von Whatever aufrufen
   b.add(w.clone());
   // (iii) normalen konstruktor von Whatever benutzen, und dort alle werte von w einsetzen
   b.add(new Whatever(w.property1, ... ,w.propertyX);
   // (iv) irgendeine factory verwenden, oder was auch immer: 
   // je nach dem wie Whatever's eben erzeugt werden
   b.add(whateverFactory.createWhatever(w));
}
```
Jetzt kannst du auch auf elemente von b zugreifen und diese verändern wie du willst, das wird auf die elemente von a keinerlei auswirkungen haben (vorausgesetzt das spielchen beginnt da nicht vom neuen: dann müsste man eben so tief kopieren, wie man's haben will)


----------



## Jay1980 (17. Apr 2009)

Aha, es scheint so zu sein, dass klonen und kopieren nicht das gleiche sind?! Nun, da muss ich mich mal schlau machen, dass das Kopieren durchaus unterschiedlich in Programmiersprachen gehändelt wird, weiss ich. Habe ich dich richtig verstanden, dass ich da mit einer normalen Zuweisung auch meine "Kopie" erreiche?

Wie gesagt, ich bin noch Java-Anfänger und ich denke: Anfänger machen keine Witze, sind aber manchmal witzig.


----------



## 0x7F800000 (17. Apr 2009)

Jay1980 hat gesagt.:


> Aha, es scheint so zu sein, dass klonen und kopieren nicht das gleiche sind?!


"Das Gleiche" wie was... Ich hab doch oben drei völlig verschiedene sachen beschrieben, die man sich unter dem Begriff "kopieren" vorstellen kann. 
clone() erzeugt laut API eine flache Kopie, das ist die "Kopie zweiter Art" in meiner Liste oben. Ob das die Art von Kopie ist, die du haben willst, musst du ja selbst wissen...



> Habe ich dich richtig verstanden, dass ich da mit einer normalen Zuweisung auch meine "Kopie" erreiche?


Die erste variante? Dadurch erreichst du lediglich, dass du im code 2 verschiedene namen für ein und dasselbe ding hast. In der Praxis ist das fast immer vollkommen sinnfrei.


----------



## Jay1980 (17. Apr 2009)

Danke, ich habe es jetzt schon geschnallt - deine ausführliche Antwort ist super, aber als ich meine geschriebene habe, habe ich deine noch gar nicht gelesen gehabt. Alles was ich dort sagte bezieht sich also auf die Sachen vor deiner Antwort - deine Antwort kam sehr kurz vor meiner, daher das Übersehen, schau auf die Uhrzeit. Ich wollte flache Kopien - das ist alles und es hat nun auch schon geklappt. Ich wollte wissen ob clone() flache Kopien erzeugt. 

Also ich begeb mich nun mal in die horizontale - ggf. bis morsche.


----------

