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(); }
Annonceindlæg fra FPT Software
13. februar 2004 - 20:50
#1
som det ses så har jeg prøvet med clone(), men det virker ikke.
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).
13. februar 2004 - 20:55
#3
men jeg skal gerne have kopieret alle elementer som listen indeholder
13. februar 2004 - 20:56
#4
Så mu du lave en løkke og clone elementerne også.
13. februar 2004 - 20:57
#5
Skal jeg lave et eksempel ?
13. februar 2004 - 20:57
#6
kan du paste nogle koder :)
13. februar 2004 - 20:57
#7
ja tak det ville være rart :)
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]
13. februar 2004 - 21:04
#9
Forkert eksempel - sorry - 5 minutter.
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]
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]
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
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.
13. februar 2004 - 21:14
#14
og et svar
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())) ); }
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()) ); }
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.
06. marts 2004 - 15:42
#18
Lukke tid ?
18. marts 2004 - 23:13
#19
He he du har ret arne_v men der er ikke kommet et svar endnu, kun kommentar
18. marts 2004 - 23:14
#20
ups det var der så aligevel, sorry :)
Kurser inden for grundlæggende programmering