2011-03-27 6 views
0

Comment gérez-vous l'aliasing dans Java? Une solution simple est de faire une copie de disons une ArrayList mais quand j'essaye d'écrire le code mes données continuent à être écrasées par les données nouvellement ajoutées. En détail:Java Collections & aliasing

ArrayList<ArrayList> temp = new ArrayList<ArrayList>() ; 
ArrayList<ArrayList> personRecord = new ArrayList<ArrayList>() ; 
ArrayList<String> personDetail = new ArrayList<String>() ; 

... 

while (input.hasNextLine()) 
    { 
     String line = input.nextLine() ; 

     String [] tokens = line.split(" ", 0) ; 


     for (String s: tokens) 
     {  
      personDetail.add(s) ; 
     } 

     temp.add(personDetail) ; 

     personRecord.addAll(temp) ; 

     temp.clear() ; 
     personDetail.clear() ; 
    } 

sortie:

[[Peter, M, 1972], [Peter, M, 1972]] 

au lieu de:

[[Peter, M, 1972], [Anne, F, 1974]] 
+0

Quelle est l'entrée? –

Répondre

2

Vous devez déplacer la création personDetail à l'intérieur de la boucle pour obtenir une nouvelle Arraylist pour chaque personne:

ArrayList<ArrayList> personRecord = new ArrayList<ArrayList<String>>() ; 

while (input.hasNextLine()) 
    { 
     ArrayList<String> = new ArrayList<String>(); 
     String line = input.nextLine() ; 

     String [] tokens = line.split(" ", 0) ; 


     for (String s: tokens) 
     {  
      personDetail.add(s) ; 
     } 
     personRecord.add(personDetail); 
    } 

temp n'est pas nécessaire dans tous les cas.

+0

merci beaucoup! – raoulbia

2

On dirait que vous êtes habitué à C++ collections! Les références d'objet en Java sont des pointeurs (malgré la syntaxe de référence) et les collections sont des collections de pointeurs. Les collections ne copient jamais les objets lorsqu'ils sont ajoutés. Si vous voulez faire une liste de listes, alors allouer la liste de listes en dehors de la boucle, et à l'intérieur de la boucle, allouer une seule liste en haut de la boucle. Remplissez-le pendant le corps de la boucle et ajoutez-le à la liste des listes au bas de la boucle. C'est tout. Aucun temporaire requis.