今天我正在努力学习我的部分代码,从文件中读取一些数据并将它们作为属性添加到对象中(我知道如何在没有这个麻烦的情况下添加/读取文件中的对象,但是想要这样做)如下:
文件是这样的:
111,john,23.1
222,jack,22.5
234,adam,12.8
Run Code Online (Sandbox Code Playgroud)
我试图使用以下内容读取此文件:
public ArrayList<Staff> LoadAllStaffs(){
ArrayList<Staff> staffs = new ArrayList<Staff>();
File file = new File(stafffile);
Staff tmpstaff = new Staff();
try {
BufferedReader inputfile = new BufferedReader(new FileReader(stafffile));
String tmp;
while((tmp = inputfile.readLine()) != null){
StringTokenizer st = new StringTokenizer(tmp , ",");
tmpstaff.setID(Integer.valueOf(st.nextToken()));
tmpstaff.setFirstName(st.nextToken());
tmpstaff.setSalary(Double.valueOf(st.nextToken()));
staffs.add(tmpstaff);
}
}
catch (IOException e) {
}
return staffs;
}
Run Code Online (Sandbox Code Playgroud)
使用println从返回的arraylist中显示此输出:
234,adam,12.8
234,adam,12.8
234,adam,12.8
Run Code Online (Sandbox Code Playgroud)
我只是移动了printlnwhile循环内部,它显示了它应该是什么.
为什么会这样?我在这里读到 - 在循环内部或外部定义变量(好吧,这里是一个对象)没有任何区别.
您没有Staff在循环内创建新实例,而是在所有迭代中重用相同的实例.因此,您将覆盖值并添加相同的对象.
移动
Staff tmpstaff = new Staff();
Run Code Online (Sandbox Code Playgroud)
到循环内的第一行.
更新:为了解决Vash这个问题,这里的问题可以解释为,如果你想存储3个对象,你需要创建这样的3个对象.您可以重用引用(tmpstaff变量)并有效地定义它并不重要(只要对它的所有引用都在同一范围内.但您必须创建3个对象,这意味着3个new命令.
更新2:为了使事情更简单,文本I read -even here- that defining variables (well, here its an Object ) inside or outside loops doesn't make any difference.意味着
File file = new File(stafffile);
Staff tmpstaff = null; // or simpler, Staff tmpstaff;
try {
...
while((tmp = inputfile.readLine()) != null){
tmpstaff = new Staff();
...
Run Code Online (Sandbox Code Playgroud)
和
while((tmp = inputfile.readLine()) != null){
Staff tmpstaff = new Staff();
...
Run Code Online (Sandbox Code Playgroud)
是等价的.
| 归档时间: |
|
| 查看次数: |
1600 次 |
| 最近记录: |