通过方法应用LinkedList



我最近正在学习如何使用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());
    }
}

我做错了什么?

当您尝试执行head = ...tail = ...时出现了一个问题(这不会在当前代码中生成任何编译时错误或错误,但一旦您开始扩展它以进行测试就会产生错误)。它们所做的只是给本地变量headtail一个新值。它不会改变workflowHeadworkflowTail

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

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

同样,workflowHead.read(...)也不能工作,因为readMethod类的成员(可能没有理想的命名),但wordflowHeadNode类型。

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

我可能会这样做:

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
}

相关内容

  • 没有找到相关文章

最新更新