2015-05-29 17 views
5

ho una classe chiamata User e un file chiamato Users.csv, come di seguito: classPerché questo metodo restituisce un ArrayList con tutti gli stessi oggetti? JAVA

utente:

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 

Inoltre, ho avere una classe chiamata test, che implementa un singolo metodo:

classe di test:

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; 
} 
} 

Il problema è nel metodo readUsers(). Mi sta restituendo un ArrayList in cui ogni elemento è lo stesso, e sono l'ultima riga di Users.csv.
Qualche consiglio perché sta succedendo? Non riesco a capirlo ...

risposta

8

Quante volte chiamate new User()? Ecco quanti oggetti utente hai creato: esattamente uno, e lo fai una volta prima del ciclo.

Soluzione, chiamare questo all'interno del ciclo - in questo modo si crea un nuovo utente per ogni elemento aggiunto all'elenco.

+0

Ma perché non va bene, per ogni ciclo, impostare Nome utente, Rg e digitare, quindi aggiungerlo alla lista? Ogni volta che i valori cambiano, aggiungo l'utente alla lista – Quik19

+1

Questa è la risposta giusta che stavo proprio per dare. Assicurati di contrassegnare questo come corretto. –

+1

@ Quik19: Esistono due cause principali dei sintomi che hai descritto: riempiendo lo stesso oggetto in continuazione (cosa stai facendo) o l'uso eccessivo di variabili statiche (un errore che tu non fare). –

4

Hai appena creato una singola istanza di User e stai semplicemente modificando le sue proprietà. Sarà necessario creare una nuova istanza di User per ogni voce nel file 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

Grazie mille per il vostro aiuto! La risposta è stata semplice ma mi stava uccidendo! Sono così stupido haha! Grazie! – Quik19

+3

Benvenuti nel mio mondo;) – MadProgrammer

2

riferimenti Java collezioni dei negozi. Così, nel tuo codice, c'è un singolo oggetto User, e il riferimento ad esso viene aggiunto a ArrayList su ogni iterazione (diverso da quello che succede in C++, dove il vettore fa una copia). Hai bisogno di qualcosa del tipo:

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 
}