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を実行しようとすると、1 つの問題がtail = ...発生します (現在のコードではコンパイル時エラーやエラーは発生しませんが、テストのために拡張を開始するとエラーが発生します)。これらのそれぞれが行うことは、単純にローカル変数headまたはtail新しい値を与えることです。変わらないworkflowHeadworkflowTail

より技術的なレベルでは、Object パラメーターを渡すと、パラメーターと元のオブジェクトの両方が同じデータを指します。したがって、そのオブジェクトを変更すると、両方が変更されますただし、パラメータをで再割り当て=すると、パラメータは別のオブジェクトを指すようになり、元のオブジェクトは元のオブジェクトを指したままになります。

おそらく必要なのは、メソッド パラメーターではなくクラス変数です。

また、はクラスのメンバー(おそらく理想的な名前ではない) ですが、タイプは であるworkflowHead.read(...)ため、機能しません。readMethodwordflowHeadNode

メソッドにハードコードするよりも、ファイル名を渡す方がよい場合もあります。「より良い」方法は、コマンドラインから渡すことですが、テスト目的では、これは理想的ではありません。

私はおそらく次のようなことをするでしょう:

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 に答える