这是list函数,因为你可以看到它在添加到vector dataList之前打印newEntry的内容。
public static Vector<entry> list()
{
entry newEntry = new entry();
Vector<entry> dataList = new Vector<entry>();
String[] splitLine;
String currentLine;
String formattedString = "";
BufferedReader in;
try
{
in = new BufferedReader(new FileReader(new File("data.txt")));
while ((currentLine = in.readLine()) != null) {
newEntry = new entry();
splitLine = currentLine.split(" ");
newEntry.record = Integer.parseInt(splitLine[0]);
newEntry.fName = splitLine[1];
newEntry.lName = splitLine[2];
newEntry.phoneNumber = splitLine[3];
dataList.add(newEntry);
}
}
catch (IOException ex)
{
System.out.println(ex);
}
for (int i = 0; i < dataList.size(); i++)
{
System.out.println(dataList.elementAt(i).record + dataList.elementAt(i).fName + dataList.elementAt(i).lName + dataList.elementAt(i).phoneNumber);
}
return dataList;
}
以下是我遇到问题的部分,它会记录(上面)返回的任何列表()并将其形成一个新的向量并将打印出来。但是,由于某种原因,它只打印最后一个值...
if ((params[0].toLowerCase()).equals("list"))
{
Vector<entry> printList = new Vector<entry>(list());
for (int i = 0; i < printList.size(); i++)
{
System.out.println(printList.elementAt(i).record + printList.elementAt(i).fName + printList.elementAt(i).lName + printList.elementAt(i).phoneNumber);
}
}
这是我在列表函数中的dataList中添加3(下面显示的前3个)时得到的输出。
1000 John Carter 1731371313
1001 Abe Lincoln 9173913143
1002 William Tell 794174141
1002 William Tell 794174141
1002 William Tell 794174141
1002 William Tell 794174141
有谁知道可能出现的问题?
答案 0 :(得分:3)
那是因为你将同一个对象插入容器三次。您应该在插入之前构造一个新对象。
splitLine = currentLine.split(" ");
newEntry = new entry();
newEntry.record = Integer.parseInt(splitLine[0]);
newEntry.fName = splitLine[1];
newEntry.lName = splitLine[2];
newEntry.phoneNumber = splitLine[3];
System.out.println(newEntry.record + newEntry.fName + newEntry.lName + newEntry.phoneNumber);
dataList.add(newEntry);
您发布完整代码是件好事,因为您还有其他错误:
public static class entry
{
public static int record;
public static String fName;
public static String lName;
public static String phoneNumber;
}
将entry
类的成员声明为静态会导致它们被您的类的所有实例共享。这就是为什么entry
类的所有实例都保存最后一个条目的值的原因。从所有成员中删除static
关键字,一切正常。
答案 1 :(得分:3)
你一直在覆盖newEntry。 这条线需要在循环中:
entry newEntry = new entry();
答案 2 :(得分:1)
entry newEntry = new entry();
这是您声明entry
对象的唯一地方。因此,当你这样做时:
newEntry.record = Integer.parseInt(splitLine[0]);
newEntry.fName = splitLine[1];
newEntry.lName = splitLine[2];
newEntry.phoneNumber = splitLine[3];
您只是更改当前对象中的值。
更好的方法可能如下所示:
while ((currentLine = in.readLine()) != null) {
newEntry = new entry();
splitLine = currentLine.split(" ");
newEntry.record = Integer.parseInt(splitLine[0]);
newEntry.fName = splitLine[1];
newEntry.lName = splitLine[2];
newEntry.phoneNumber = splitLine[3];
dataList.add(newEntry);
}
但如果我这样做,我会为entry
类编写一个构造函数,只需要4个字符串,并初始化record
,fName
,lName
,和phoneNumber
基于这4个字符串(您可以在构造函数中parseInt
。)
例如:
public entry(string rec, string first, string last, string phone) {
record = Integer.parseInt(rec);
fName = first;
lName = last;
phoneNumber = phone;
}
那么在您正在接收数据的循环中,您可以简单地执行此操作:
while ((currentLine = in.readLine()) != null) {
splitLine = currentLine.split(" ");
newEntry = new entry(splitLine[0], splitLine[1], splitLine[2], splitLine[3]);
dataList.add(newEntry);
}
答案 3 :(得分:0)
因为您正在使用相同的条目实例。你正在制作实例。代码中的每个文件行都是一个条目,对吗?所以,为每一行做一个新的事情。
while ((currentLine = in.readLine()) != null){
newEntry = new entry();
//do whatever you want
dataList.add(newEntry);
}