矢量不包含似乎正确的数据

时间:2013-11-11 00:31:17

标签: java

这是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

有谁知道可能出现的问题?

4 个答案:

答案 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个字符串,并初始化recordfNamelName,和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);

}