2015-05-29 9 views
5
JAVA

Ich habe eine Klasse namens User und eine Datei Users.csv, wie unten genannt:Warum gibt diese Methode eine ArrayList mit den gleichen Objekten zurück?

Benutzerklasse:

public class User 
{ 
private String name; 
private String rg; 
private String type; 

public String getName() 
{ 
    return name; 
} 

public String getRg() 
{ 
    return rg; 
} 

public String getType() 
{ 
    return type; 
} 

public void setName(String n) 
{ 
    name = n; 
} 

public void setRg(String r) 
{ 
    rg = r; 
} 

public void setType(String t) 
{ 
    type = t; 
} 
} 

Users.csv:

a,b,c 
d,e,f 
as,d,cf 

Auch ich habe eine Klasse namens test, die eine einzige Methode implementiert:

Testklasse:

public class test 
{ 
public ArrayList<User> readUsers(String path) throws IOException //read all users from file and returns an ArrayList 
{  
    ArrayList<User> list = new ArrayList<User>(); 
    String[] str; 
    User u = new User(); 
    BufferedReader buffRead = new BufferedReader(new FileReader(path)); 
    String line = buffRead.readLine(); 
    while(line != null) 
    { 
      str = line.split(","); 
      u.setName(str[0]); //sets each field read to "u" 
      u.setRg(str[1]); 
      u.setType(str[2]); 
      list.add(u); //adding user to the list to be returned 
      line = buffRead.readLine(); //reading next register 
    } 
buffRead.close(); 
return list; 
} 
} 

Das Problem ist in dem Verfahren readUsers(). Es gibt mir eine ArrayList zurück, in der jedes Element gleich ist, und sie sind die in der letzten Zeile von Users.csv.
Irgendein Tipp, warum es passiert? Ich kann es nicht herausfinden ...

Antwort

8

Wie oft rufen Sie new User()? Das ist, wie viele Benutzerobjekte Sie erstellt haben: genau ein, und Sie tun dies einmal vor die Schleife.

Lösung, rufen Sie diese innerhalb der Schleife - auf diese Weise erstellen Sie einen neuen Benutzer für jedes Element, das Sie der Liste hinzufügen.

+0

Aber warum ist es nicht in Ordnung, für jede Schleife den Namen des Benutzers, Rg und Typ, dann fügen Sie ihn der Liste hinzu? Jedes Mal, wenn sich die Werte ändern, füge ich den Benutzer zur Liste hinzu – Quik19

+1

Das ist die Antwort genau dort, die ich gerade geben wollte. Bitte stellen Sie sicher, dass Sie diese als richtig markieren. –

+1

@ Quik19: Es gibt zwei Hauptursachen der Symptome, die Sie beschrieben haben - das gleiche Objekt wieder und wieder auffüllen (was Sie tun) oder übermäßige Verwendung von statischen Variablen (ein Fehler, den Sie " nicht machen). –

4

Sie haben nur eine einzige Instanz von User erstellt und ändern einfach ihre Eigenschaften. Sie müssen eine neue Instanz von User für jeden Eintrag in der CSV-

//User u = new User(); 
//... 
while(line != null) 
{ 
     str = line.split(","); 
     User u = new User(); 
     u.setName(str[0]); //sets each field read to "u" 
     u.setRg(str[1]); 
     u.setType(str[2]); 
     list.add(u); //adding user to the list to be returned 
     line = buffRead.readLine(); //reading next register 
} 
+0

Vielen Dank für Ihre Hilfe! Die Antwort war einfach, aber es brachte mich um! Ich bin so dumm, haha! Danke! – Quik19

+3

Willkommen in meiner Welt;) – MadProgrammer

2

Java Sammlungen speichern Referenzen-Datei erstellen. Daher gibt es in Ihrem Code ein einziges Benutzerobjekt, und der Verweis darauf wird bei jeder Iteration zur ArrayList hinzugefügt (anders als in C++, wo der Vektor eine Kopie erstellt). Sie brauchen etwas wie:

while(line != null) 
{ 
    str = line.split(","); 
    User u = new User(); 
    u.setName(str[0]); //sets each field read to "u" 
    u.setRg(str[1]); 
    u.setType(str[2]); 
    list.add(u); //adding user to the list to be returned 
    line = buffRead.readLine(); //reading next register 
}