Avatar billede brian8 Nybegynder
13. februar 2004 - 20:49 Der er 19 kommentarer og
1 løsning

kopiere en ArrayList med indhold

Hvordan kopiere jeg ArrayList playerTable så jeg får to nye kopier som skal ligge ned i metoden fordelRangPoint()?
Kodrene ses nedenfor.

private static ArrayList playerTable;

public static void main(String args[]){
  fordelRangPoint(playerTable)
}
public static ArrayList fordelRangPoint(ArrayList pList){
  ArrayList newPlayerList = (ArrayList)pList.clone();
  ArrayList oldPlayerList = (ArrayList)pList.clone();
}
Avatar billede brian8 Nybegynder
13. februar 2004 - 20:50 #1
som det ses så har jeg prøvet med clone(), men det virker ikke.
Avatar billede arne_v Ekspert
13. februar 2004 - 20:53 #2
Det virker vel i den forstand at du får en ny array  list som indeholder
de samme elementer som den originale (bemærk: ikke kopier af elementerne).
Avatar billede brian8 Nybegynder
13. februar 2004 - 20:55 #3
men jeg skal gerne have kopieret alle elementer som listen indeholder
Avatar billede arne_v Ekspert
13. februar 2004 - 20:56 #4
Så mu du lave en løkke og clone elementerne også.
Avatar billede arne_v Ekspert
13. februar 2004 - 20:57 #5
Skal jeg lave et eksempel ?
Avatar billede brian8 Nybegynder
13. februar 2004 - 20:57 #6
kan du paste nogle koder :)
Avatar billede brian8 Nybegynder
13. februar 2004 - 20:57 #7
ja tak det ville være rart :)
Avatar billede arne_v Ekspert
13. februar 2004 - 21:02 #8
Kode:

import java.util.*;

public class CloneTest {
    public static void main(String args[]){
        ArrayList lst1 = new ArrayList();
        lst1.add(new Integer(123));
        lst1.add(new String("abc"));
        lst1.add(new StringBuffer("ABC"));
        ArrayList lst2 = (ArrayList)lst1.clone();
        ArrayList lst3 = new ArrayList();
        for(int i = 0; i < lst1.size(); i++) {
            lst3.add(lst1.get(i));
        }
        System.out.println(lst1 + " " + lst2 + " " + lst3);
        lst2.add(new Boolean(true));
        ((StringBuffer)lst3.get(2)).append("D");
        System.out.println(lst1 + " " + lst2 + " " + lst3);
    }
}

output:

[123, abc, ABC] [123, abc, ABC] [123, abc, ABC]
[123, abc, ABCD] [123, abc, ABCD, true] [123, abc, ABCD]
Avatar billede arne_v Ekspert
13. februar 2004 - 21:04 #9
Forkert eksempel - sorry - 5 minutter.
Avatar billede arne_v Ekspert
13. februar 2004 - 21:10 #10
Ny kode:

import java.util.*;

public class CloneTest {
    public static void main(String args[]){
        ArrayList lst1 = new ArrayList();
        lst1.add(new StringBuffer("a"));
        lst1.add(new StringBuffer("bb"));
        lst1.add(new StringBuffer("ccc"));
        ArrayList lst2 = (ArrayList)lst1.clone();
        ArrayList lst3 = new ArrayList();
        for(int i = 0; i < lst1.size(); i++) {
            StringBuffer sb = (StringBuffer)lst1.get(i);
            lst3.add(new StringBuffer(sb.toString()));
        }
        System.out.println(lst1 + " " + lst2 + " " + lst3);
        lst2.add(new StringBuffer("dddd"));
        ((StringBuffer)lst3.get(2)).append("ccc");
        System.out.println(lst1 + " " + lst2 + " " + lst3);
    }
}

Ny output:

[a, bb, ccc] [a, bb, ccc] [a, bb, ccc]
[a, bb, ccc] [a, bb, ccc, dddd] [a, bb, cccccc]
Avatar billede arne_v Ekspert
13. februar 2004 - 21:12 #11
Stadig ikke godt nok.

3. forsøg !

Kode:

import java.util.*;

public class CloneTest {
    public static void main(String args[]){
        ArrayList lst1 = new ArrayList();
        lst1.add(new StringBuffer("a"));
        lst1.add(new StringBuffer("bb"));
        lst1.add(new StringBuffer("ccc"));
        ArrayList lst2 = (ArrayList)lst1.clone();
        ArrayList lst3 = new ArrayList();
        for(int i = 0; i < lst1.size(); i++) {
            StringBuffer sb = (StringBuffer)lst1.get(i);
            lst3.add(new StringBuffer(sb.toString()));
        }
        System.out.println(lst1 + " " + lst2 + " " + lst3);
        ((StringBuffer)lst2.get(1)).append("bb");
        ((StringBuffer)lst3.get(2)).append("ccc");
        System.out.println(lst1 + " " + lst2 + " " + lst3);
    }
}


Output:

[a, bb, ccc] [a, bb, ccc] [a, bb, ccc]
[a, bbbb, ccc] [a, bbbb, ccc] [a, bb, cccccc]
Avatar billede arne_v Ekspert
13. februar 2004 - 21:13 #12
Nu kan vi se pointen:

når man ændrer i et object i lst2 så retter man også i lst1, fordi
lst2 er en shallow clone af lst1 og derfor indeholder de samme elementer

når man ændrer i et object i lst3 så retter man ikke i lst1, fordi
lst3 er en deep clone af lst1 og derfor indeholder cloner af elementerne
Avatar billede arne_v Ekspert
13. februar 2004 - 21:14 #13
Og jeg skal beklage at det tog mig så lang tid at få lavet et eksempel som
viste det rigtige.
Avatar billede arne_v Ekspert
13. februar 2004 - 21:14 #14
og et svar
Avatar billede ulrikm Nybegynder
13. februar 2004 - 22:59 #15
Når du har String[] (som er "immutable"), kan du lave en kopi med clone() mere direkte:

public static ArrayList fordelRangPoint(ArrayList pList)
{
  ArrayList newPlayerList =
    new ArrayList( Arrays.asList(pList.toArray("".getClass())) )
  ArrayList oldPlayerList =
    new ArrayList( Arrays.asList(pList.toArray("".getClass())) );
}
Avatar billede ulrikm Nybegynder
13. februar 2004 - 23:00 #16
heh, og ikke glemme kloning ;-)

public static ArrayList fordelRangPoint(ArrayList pList)
{
  ArrayList newPlayerList =
    new ArrayList( Arrays.asList(pList.toArray("".getClass()).clone() ) )
  ArrayList oldPlayerList =
    new ArrayList( Arrays.asList(pList.toArray("".getClass()).clone()) );
}
Avatar billede ulrikm Nybegynder
14. februar 2004 - 00:21 #17
Glem mine kommentarer - Collection objekter laver en shallow+ klon, så ovenstående svarer til det oprindelige i spørgsmålet.
Avatar billede arne_v Ekspert
06. marts 2004 - 15:42 #18
Lukke tid ?
Avatar billede brian8 Nybegynder
18. marts 2004 - 23:13 #19
He he du har ret arne_v men der er ikke kommet et svar endnu, kun kommentar
Avatar billede brian8 Nybegynder
18. marts 2004 - 23:14 #20
ups det var der så aligevel, sorry :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester