0

这是列表函数,您可以看到它在添加到矢量数据列表之前打印 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;
}

这是我遇到问题的部分,它将返回(上面)返回的任何 list() 并将其形成一个新向量并将被打印出来。但是,出于某种原因,它只打印最后一个值......

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);
    }
}

这是将 3(如下所示的前 3 个)添加到 list 函数中的 dataList 时得到的输出。

1000 约翰·卡特 1731371313
1001 亚伯·林肯 9173913143
1002 威廉·泰尔 794174141
1002 威廉·泰尔 794174141
1002 威廉·泰尔 794174141
1002 威廉·泰尔 794174141

有谁知道可能出了什么问题?

4

4 回答 4

3

那是因为您将同一个对象插入容器 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关键字,一切都会正常工作。

于 2013-11-11T00:34:52.743 回答
3

你不断覆盖 newEntry。此行需要在循环中:

entry newEntry = new entry(); 
于 2013-11-11T00:35:01.740 回答
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 个字符串的类编写一个构造函数,并根据这 4 个字符串初始化record, fName, , 和(你可以在构造函数中)。lNamephoneNumberparseInt

例如:

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);
}
于 2013-11-11T00:37:45.720 回答
0

这是因为您在 while 中使用了相同的 entry 实例。您正在制作实例。代码中的每个文件的行都是一个条目,对吗?因此,为每一行创建一个新的实例。

while ((currentLine = in.readLine()) != null){

    newEntry = new entry();

    //do whatever you want

    dataList.add(newEntry);

}
于 2013-11-11T00:39:51.863 回答