1

我用包含数据变量和下一个节点变量的节点对象制作了一个单链表。客户对象存储在数据变量中,客户文件有一个姓氏变量和一个名字变量,如下所示:

public customer
{
String Surname;
String Forename;
get and set methods for each;
}

链接列表和节点类将按姓氏 (AZ) 升序排序,因此 George Clooney 排在 Jay Gatsby 之前。用于在链表中递归插入项目的方法很好,在尝试使用 and 保存文件或使用 and 加载文件之前,我已经运行了ObjectOutputStream许多FileOutputStream测试。ObjectInputStreamFileInputStream

作为我所做的所有研究的结果,我得出的结论是,最好使用自定义链表(不是标准 Java 列表)上的可序列化接口将整个链表保存为对象,以将其序列化并保存到文件。

现在,这是我的问题:我添加了 1 个带有随机姓氏的 Node 对象,它工作正常:每次添加项目时,列表都会从文件中反序列化并加载到新SinglyLinkedList对象中。ObjectOutputStream新节点被添加并放置在列表中的正确位置,然后这个新列表通过和传递回文件FileOutputStream

我添加了一项,这很好;但是,如果我添加另一个,它说它很好(没有错误 - 我有所有适当的trycatch声明),但它实际上并没有更新列表。print 方法强化了这一点,因为它也以相同的方式访问列表并且只打印第一项(即使添加了更多项)。当我询问列表的长度时,它只是给了我第一项(例如返回 1)。

如果我关闭它并重新运行它,我将再次收到相同的 1 个节点,仅此而已。然后,如果我要添加另一个,它就不会再工作了。

以下是一些有用的信息:

  • 客户文件、节点和单链表类具有必要的可序列化导入并实现可序列化标头
  • 有 4 个单独的类,客户文件 - 包含数据,节点 - 包含客户文件和下一个节点,单链表 - 包含编辑列表的所有方法和主类,其中包含所有扫描仪和可序列化流对象(例如 ObjectOutputStream)并从键盘获取命令和数据(例如“ADD”、“PRINT”)
  • 有单独的方法可以保存和加载到文件中,这些方法用于减少屏幕上的代码覆盖率——这可能是问题所在——我是这个新手,但这里是代码。

在 MAIN METHOD 中添加节点的代码 - 不是递归例程

CustomerFile custDat = new CustomerFile(fName,sName); 

            Node custNode = new Node(custDat, null);
            SinglyLinkedList a = loadListFromFile();
            if (a == null)
            {
                System.out.println("Creating new list");
                SinglyLinkedList newList = new SinglyLinkedList();
                newList.addRecord(custNode, null);
                a = newList;
            }
            else
            {
                a.addRecord(a.getHead(), custNode);
            }
            saveListToFile(a);
            System.out.println("File added successfully");

并且loadListFromFile方法(保存列表方法类似,但有输出)有一个集合fileName

private static SinglyLinkedList loadListFromFile()

{
    SinglyLinkedList lst = null;
    try
    {
        ObjectInputStream is = new ObjectInputStream(new FileInputStream(fileName));
        lst = (SinglyLinkedList) is.readObject();
        is.close();
    }
    catch(FileNotFoundException e)
    {
        e.printStackTrace();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
    catch(ClassNotFoundException e)
    {
        e.printStackTrace();
    }
    return lst;
}
4

1 回答 1

0

幸运的是,我已经解决了这个问题!感谢您的帮助,但问题归结为我的逻辑失败。我运行一个循环,获取值并将它们添加到节点,这些节点被添加到一个列表中,该列表在列表中被声明为 NEW - 即列表无法到达 saveListToFile 方法,因此不会添加到正在保存的列表中文件

于 2012-12-17T23:28:14.140 回答