为什么此方法返回一个包含所有相同对象的 ArrayList? JAVA
Why is this method returning an ArrayList with all the same objects? JAVA
我有一个名为 User
的 class 和一个名为 Users.csv
的文件,如下所示:
用户 class:
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
的 class,它实现了一个方法:
测试class:
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
.
最后一行的那个
任何提示为什么会发生?我想不通...
你打了多少次new User()
?这就是您创建的 User 对象的数量:恰好 一个 ,并且您在 before 循环中执行了一次。
解决方案,在循环的[=15=]内部调用此方法 -- 这样您就可以为添加到列表中的每个项目创建一个新用户。
您只创建了 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
}
Java 集合存储引用。因此,在您的代码中,只有一个 User 对象,并且在每次迭代时都会将对它的引用添加到 ArrayList(与 C++ 中发生的情况不同,在 C++ 中 vector 进行复制)。你需要这样的东西:
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
}
我有一个名为 User
的 class 和一个名为 Users.csv
的文件,如下所示:
用户 class:
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
的 class,它实现了一个方法:
测试class:
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
.
最后一行的那个
任何提示为什么会发生?我想不通...
你打了多少次new User()
?这就是您创建的 User 对象的数量:恰好 一个 ,并且您在 before 循环中执行了一次。
解决方案,在循环的[=15=]内部调用此方法 -- 这样您就可以为添加到列表中的每个项目创建一个新用户。
您只创建了 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
}
Java 集合存储引用。因此,在您的代码中,只有一个 User 对象,并且在每次迭代时都会将对它的引用添加到 ArrayList(与 C++ 中发生的情况不同,在 C++ 中 vector 进行复制)。你需要这样的东西:
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
}