7

わかりましたので、リンクされたリストを印刷する方法を学ぼうとしています。リストに使用する必要があるすべてのメソッドがありますが、ノードの値を表示する方法がわかりません。メインで非静的メソッドを呼び出そうとするとエラーが発生し続けたため、現在、メインメソッドには何もありません。リストの内容を表示する toString メソッドがあります。この toString を呼び出して各ノードの値を表示するにはどうすればよいでしょうか? どんなアドバイスでも大歓迎です。

ノードクラスは次のとおりです。

public class LinkedListNode
{

    private int data;
    private LinkedListNode next;


    public LinkedListNode(int data)
    {
        this.data = data;
        this.next = null;
    }

    public int getData()
    {
        return data;
    }

    public void setData(int d)
    {
        data = d;
    }

    public LinkedListNode getNext()
    {
        return next;
    }

    public void setNext(LinkedListNode n)
    {
        next = n;
    }
}

リストを操作するためのメインとメソッドを含む LinkedList クラスを次に示します。

public class LinkedList {

    public LinkedListNode head;

    public static void main(String[] args) {

    LinkedList l = new LinkedList();
    l.insertFront(0);
    System.out.println(l.toString());

    }

    public LinkedList() {
        this.head = null;
    }

    public int removeFront(){
        if(head == null){
            System.out.println("Error - Attempting to call removeFront() on empty list");
            return 0;
        }else{
            int temp = head.getData();
            head = head.getNext();  
            return temp;
        }

    }

    public void insertFront(int data){
        if(head == null){
            head = new LinkedListNode(data);
        }else{
            LinkedListNode newNode = new LinkedListNode(data);
            newNode.setNext(head);
            head = newNode;
        }       
    }

    public void insertBack(int data){
        if(head == null){
            head = new LinkedListNode(data);
        }else{
            LinkedListNode newNode = new LinkedListNode(data);
            LinkedListNode current = head;
            while(current.getNext() != null){
                current = current.getNext();
            }
            current.setNext(newNode);
        }       
    }

    public int removeBack(){
        if(head == null){
            System.out.println("Error - Attempting to call removeBack() on empty list");
            return 0;
        }else if (head.getNext() == null){
            int temp = head.getData();
            head = null;
            return temp;
        }else{

            LinkedListNode current = head;
            while(current.getNext().getNext() != null){
                current = current.getNext();
            }
            int temp = current.getNext().getData();
            current.setNext(null);
            return temp;
        }       
    }

    public String toString(){
        String retStr = "Contents:\n";

        LinkedListNode current = head;
        while(current != null){
            retStr += current.getData() + "\n";
            current = current.getNext();

        }

        return retStr;
    }

    public LinkedListNode getHead() {
        return head;
    }

    public void setHead(LinkedListNode head) {
        this.head = head;
    }
}
4

5 に答える 5

4

他のいくつかの回答やコメントで指摘されているように、ここで欠けているのは、 toString() メソッドによって生成された文字列を出力するための JVM System クラスの呼び出しです。

LinkedList myLinkedList = new LinkedList();
System.out.println(myLinkedList.toString());

これで作業は完了しますが、そのようにすることはお勧めしません。Object クラスの javadoc を見ると、toString() に関する次の説明が見つかります。

オブジェクトの文字列表現を返します。一般に、toString メソッドは、このオブジェクトを「テキストで表す」文字列を返します。結果は、人が読みやすい簡潔で有益な表現になるはずです。すべてのサブクラスがこのメソッドをオーバーライドすることをお勧めします。

そこに追加された強調は私自身のものです。リンクされたリストの状態全体を含む文字列を作成していますが、クラスを使用している人はおそらく期待していません。次の変更をお勧めします。

  1. LinkedListNode クラスに toString() メソッドを追加します。
  2. LinkedList クラスの toString() メソッドを更新して、より簡潔にします。
  3. 現在 toString() に期待していることを行う printList() という新しいメソッドを LinkedList クラスに追加します。

LinkedListNode:

public String toString(){
   return "LinkedListNode with data: " + getData();
}

LinkedList で:

public int size(){
    int currentSize = 0;
    LinkedListNode current = head;
    while(current != null){
        currentSize = currentSize + 1;
        current = current.getNext();
    }

    return currentSize;
}

public String toString(){
    return "LinkedList with " + size() + "elements.";
}

public void printList(){
    System.out.println("Contents of " + toString());

    LinkedListNode current = head;
    while(current != null){
        System.out.println(current.toString());
        current = current.getNext();
    }

}
于 2013-10-09T21:55:53.970 に答える
1

JVMアプリケーションを実行しようとすると、メイン メソッドが静的に呼び出されます。このようなもの:

LinkedList.main();

つまり、LinkedListクラスのインスタンスはありません。メソッドを呼び出すためにtoString()、クラスの新しいインスタンスを作成できますLinkedList

mainしたがって、メソッドの本体は次のようになります。

public static void main(String[] args){
    // creating an instance of LinkedList class
    LinkedList ll = new LinkedList();

    // adding some data to the list
    ll.insertFront(1);
    ll.insertFront(2);
    ll.insertFront(3);
    ll.insertBack(4);

    System.out.println(ll.toString());
}
于 2013-10-09T21:40:44.413 に答える
1

私は次のようにします:

public static void main(String[] args) {

    LinkedList list = new LinkedList();
    list.insertFront(1);
    list.insertFront(2);
    list.insertFront(3);
    System.out.println(list.toString());
}

String toString() {
    StringBuilder result = new StringBuilder();
    for(Object item:this) {
        result.append(item.toString());
        result.append("\n"); //optional
    }
    return result.toString();
}
于 2014-04-09T13:50:04.553 に答える