Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个方法返回一个包含所有相同对象的ArrayList?JAVA_Java_File_Csv_Arraylist_Bufferedreader - Fatal编程技术网

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

为什么这个方法返回一个包含所有相同对象的ArrayList?JAVA,java,file,csv,arraylist,bufferedreader,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 ty

我有一个名为
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;
}
}
a,b,c
d,e,f
as,d,cf
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;
}
}  
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;
}
}
a,b,c
d,e,f
as,d,cf
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;
}
}  
另外,我还有一个名为
test
的类,它实现了一个方法:

测试类:

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;
}
}
a,b,c
d,e,f
as,d,cf
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;
}
}  
公共类测试
{
公共ArrayList readUsers(字符串路径)抛出IOException//从文件中读取所有用户并返回ArrayList
{       
ArrayList=新建ArrayList();
字符串[]str;
用户u=新用户();
BufferedReader buffRead=new BufferedReader(new FileReader(path));
String line=buffRead.readLine();
while(行!=null)
{
str=行分割(“,”);
u、 setName(str[0]);//将读取的每个字段设置为“u”
u、 setRg(str[1]);
u、 setType(str[2]);
list.add(u);//将用户添加到要返回的列表中
line=buffRead.readLine();//读取下一个寄存器
}
buffRead.close();
退货清单;
}
}  
问题出在方法
readUsers()
中。它返回给我一个数组列表,其中每个元素都是相同的,它们位于
Users.csv的最后一行


有什么提示吗?我想不出来…

你给新用户()打了多少次电话?这就是您创建的用户对象的数量:正好一个,并且在循环之前执行一次


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

您只创建了一个
用户
的实例,只需更改它的属性。您需要为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
}

Java集合存储引用。因此,在代码中,有一个用户对象,并且在每个迭代中将其引用添加到ARARYLIST(与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
}

但为什么不可以为每个循环设置用户名、Rg和类型,然后将其添加到列表中?每次值更改时,我都会将用户添加到列表中这就是我即将给出的答案。请确保您将此标记为正确。@Quik19:您描述的症状有两个主要原因——反复填充同一对象(您正在做的事情)或过度使用静态变量(您没有犯错误)。非常感谢您的帮助!答案很简单,但我快死了!我好笨哈哈!谢谢欢迎来到我的世界;)