我最近正在学习如何使用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 = ...
时出现了一个问题(这不会在当前代码中生成任何编译时错误或错误,但一旦您开始扩展它以进行测试就会产生错误)。它们所做的只是给本地变量head
或tail
一个新值。它不会改变workflowHead
或workflowTail
。
在更技术性的层面上,当传入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
}