为什么这个方法返回一个包含所有相同对象的ArrayList? JAVA

时间:2015-05-29 01:55:08

标签: java file csv arraylist bufferedreader

我有一个名为User的班级和一个名为Users.csv的文件,如下所示:

用户类:

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

另外,我有一个名为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;
}
}  

问题出在方法readUsers()中。它返回一个ArrayList,其中每个元素都相同,它们是Users.csv最后一行的那个。
任何提示为什么会发生?我无法弄清楚......

3 个答案:

答案 0 :(得分:8)

您拨打new User()多少次?这是您创建的用户对象的数量:完全一个,并且在之前循环执行此操作。

解决方案,在循环中调用 - 这样就可以为添加到列表中的每个项目创建一个新用户。

答案 1 :(得分:4)

您只创建了User的单个实例,并且只是更改了它的属性。您需要为CSV文件中的每个条目创建User的新实例

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

答案 2 :(得分:2)

Java集合存储引用。因此,在您的代码中,只有一个User对象,并且在每次迭代时都会将对它的引用添加到ArrayList中(与C ++中的内容不同,其中向量执行复制)。你需要这样的东西:

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
}