0

我最近正在学习如何使用 LinkedList 并且一切正常,但是如果我将其用作直接方法(不使用方法),则会出现很多错误。

我想要做的是,读取文件文本并将其保存到 LinkedList 中。

这是我到目前为止所拥有的:

public static void main(String[] args) {

    Node<String> workflowHead = null;
    Node<String> workflowTail = null;

    try {
        int i = 0;
        Scanner in = new Scanner(new FileInputStream("workflow.txt"));
        while (in.hasNextLine()) {
            if (i == 0) {
                workflowHead = new Node<String>(in.nextLine());
                workflowTail = workflowHead;
            }
            else {
                workflowTail.next = new Node<String>(in.nextLine());
                workflowTail = workflowTail.next;
            }
            i++;
        }
        in.close();
    } catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
    }
}

以上是我所说的不使用方法的“直接方法”。

现在,告诉我,我如何通过使用方法来实现所有这些?

上面的代码工作正常,但我需要将其转换为使用方法的代码。

我像这样尝试过,但失败得很惨:

public static void main(String[] args) {

    Node<String> workflowHead = null;
    Node<String> workflowTail = null;

    workflowHead.read(workflowHead, workflowTail);
} //End of main

public class Method {

public void read(Object head, Object tail) {
    try {
        int i = 0;
        Scanner in = new Scanner(new FileInputStream("workflow.txt"));
        while (in.hasNextLine()) {
            if (i == 0) {
                head = new Node<String>(in.nextLine());
                tail = head;
            }
            else {
                tail.next = new Node<String>(in.nextLine());
                tail = tail.next;
            }
            i++;
        }
        in.close();
    } catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
    }
}

我做错了什么?

4

1 回答 1

0

当您尝试执行head = ...or时会出现一个问题tail = ...(这不会在您当前的代码中生成任何编译时错误或错误,但一旦您开始对其进行扩展以对其进行测试)。它们中的每一个都会简单地给出局部变量headtail新值。它不会改变workflowHeadworkflowTail

在更技术层面上,当您传入一个 Object 参数时,参数和原始对象都将指向相同的数据。所以修改那个对象会改变两者。但是,当您使用重新分配参数时=,参数现在将指向不同的对象,而原始对象仍将指向原始对象。

您可能想要的是类变量而不是方法参数。

此外,workflowHead.read(...)不会工作,因为read它是Method类的成员(可能不是理想的命名)但wordflowHead类型为Node.

传递文件名而不是在方法中硬编码它可能是一个更好的主意。“更好”的方法是从命令行传递它,但是,出于测试目的,这并不理想。

我可能会做这样的事情:

public static void main(String[] args) {
   MyLinkedList<String> linkedList = new MyLinkedList<String>();
   linkedList.read("workflow.txt");
}

static class MyLinkedList<T>
{
   private Node<T> head = null, tail = null;
   public void read(String filename)
   {
     // ... - you can freely reassign head and tail here
   }

   // I'm assuming this class is defined elsewhere,
   //   but defining it here would likely make more sense
   private class Node<T>
   {
     // ...
   }
}

将整个read方法放入MyLinkedList构造函数中可能会更好。

如果以上内容超出了你目前的理解,这可能更容易理解:

public static void main(String[] args) {
   read("workflow.txt");
}

static Node<T> head = null, tail = null; // these are class variables
static void read(String filename)
{
   // ...
   Scanner in = new Scanner(new FileInputStream(filename));
   // ... - you can freely reassign head and tail here
}
于 2013-05-15T08:57:45.940 回答