为什么这个方法返回一个包含所有相同对象的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:您描述的症状有两个主要原因——反复填充同一对象(您正在做的事情)或过度使用静态变量(您没有犯错误)。非常感谢您的帮助!答案很简单,但我快死了!我好笨哈哈!谢谢欢迎来到我的世界;)