我想将文本文件数据添加到ArrayList。 这是我的文本文件
60000115 2016-10-26-05:57:47
60000104 2016-10-26-05:58:27
60000082 2016-10-26-05:58:38
60000074 2016-10-26-06:01:04
我使用 space 分割数据。所以有两个部分。 ID和日期。 我创建了一个名为Employee的bean类,它有两个名为user_id和mDate的String。 employeArrayList是我使用Employee类创建的ArrayList。 问题是我无法为Arraylist添加值。只有最后一行数据插入到ArrayList中。例如: - 60000074 2016-10-26-06:01:04 。 四行 60000074 2016-10-26-06:01:04 。
这是我的代码。
for (File f : files) {
FileInputStream fis;
try {
fis = new FileInputStream(f);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
String aLine;
while ((aLine = in.readLine()) != null) {
String[] tokens = aLine.split(" ");
emp.setUser_id(tokens[0]);
emp.setmDate(tokens[1]);
employeArrayList.add(emp);
out.write(aLine);
out.newLine();
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:4)
每次创建一个新的Employee
对象:
while ((aLine = in.readLine()) != null) {
String[] tokens = aLine.split(" ");
Employee emp = new Employee();
emp.setUser_id(tokens[0]);
emp.setmDate(tokens[1]);
employeArrayList.add(emp);
out.write(aLine);
out.newLine();
}
原始代码的问题在于您重复使用同一个对象emp
。这意味着您将相同的对象重复插入列表中。当您在循环的每次迭代中更改该对象的字段时,您会影响列表中的每个条目。通过将emp
限定为循环,它不会被回收,您的代码应该按预期工作。
答案 1 :(得分:3)
问题是您反复更新相同的 \ temp> / 对象。
您必须为每次迭代创建一个 new ;并添加它。
此外:你应该只使用"豆"在使用需要它们的框架时,使用 setter 作为核心属性。
换句话说:你的bean类应该更像
public class EmplyoeeBeen {
private final String id;
private final String date;
public EmplyoeeBeen(String id, String date) {
this.id = id;
...
你在这个课上只有 getters ,没有制定者!而且:你可能也想要很好的equals / hashCode方法。
最后:对命名保持一致:不要使用" _"下划线(它们只进入CONSTANT_NAMES);并使用" m"等前缀。 + fieldname ...一直;或永远不会。但是不要去找userId和mDate!
但最重要的是:避免字符串化输入。我的意思是:ID 不一个字符串。日期不日期。当你的字段带有含义;然后使用**类来表示具有该含义的那些。例如,您可以创建自己的Id类;并且肯定:您希望将日期字符串转换为真正的Date对象。
答案 2 :(得分:1)
这是因为您每次都没有创建新员工对象。像下面一样更改你的代码,这样每次都不会采用相同的对象
for (File f : files) {
FileInputStream fis;
try {
fis = new FileInputStream(f);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
String aLine;
while ((aLine = in.readLine()) != null) {
String[] tokens = aLine.split(" ");
Employee emp=new Employee(); //create new object of employee
emp.setUser_id(tokens[0]);
emp.setmDate(tokens[1]);
employeArrayList.add(emp);
out.write(aLine);
out.newLine();
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 3 :(得分:1)
每次都无需创建令牌变量。由于字符串是不可变类,您可以直接重新分配该值。
String[] tokens = null;
for (File f : files) {
FileInputStream fis;
try {
fis = new FileInputStream(f);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
String aLine;
while ((aLine = in.readLine()) != null) {
Employee emp = new Employee();
tokens = aLine.split(" ");
emp.setUser_id(tokens[0]);
emp.setmDate(tokens[1]);
employeArrayList.add(emp);
out.write(aLine);
out.newLine();
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
每次为每一行创建Employee对象。
另一种最好的方法是以可以直接将数据保存到bean的方式保存数据。 以JSON格式保存。并使用GSON解析该数据。您可以在Bean中使用用户和数据数组作为 ArrayList 。
答案 4 :(得分:0)
Please Try This
List <String,String> emp = new ArrayList<String,String>();
emp.add(tokens[0],tokens[1]);
答案 5 :(得分:0)
问题:您通过更改值使用相同的对象。它将反映最新的值,但是该数组列表中的所有值都会将单个对象指向Memory。
1.创建Employee在循环内部,以便为每次迭代创建新对象。