0

リンク リストの作成とテストに使用している Node クラスと TestMain クラスがあります。Node クラスの toString メソッドをオーバーライドして、Node (値と次) を出力しました。しかし、リストを再帰的に出力しています。指定したノードのみを印刷したい。誰か教えてくれませんか

  1. toString がリスト全体を再帰的に出力するのはなぜですか?
  2. main() で必要なノードのみを出力するために変更する必要があるもの

public class Node {
    private int value;
    private Node next;

    Node(int value){
        this.value=value; 
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public String toString(){
        return "value = " +  this.value + ", next = " + getNext();
    }
}


public class TestMain {

    public static void main(String[] args) {
        System.out.println("Begin TestMain \n");

        Node head = new Node(10);
        Node n1 = new Node(11);
        Node n2 = new Node(12);
        Node n3 = new Node(13);

        head.setNext(n1);
        n1.setNext(n2);
        n2.setNext(n3);

        System.out.println("Head : " + head);
        System.out.println("n1 : " + n1);
        System.out.println("n2 : " + n2);
        System.out.println("n3 : " + n3);

        System.out.println("\nEnd TestMain");

    }

}


//>>>>>> output <<<<<<<<<
Begin TestMain 

Head : value = 10, next = value = 11, next = value = 12, next = value = 13, next = null
n1 : value = 11, next = value = 12, next = value = 13, next = null
n2 : value = 12, next = value = 13, next = null
n3 : value = 13, next = null

End TestMain

//>>>>> Expected Output <<<<<<<<
Begin TestMain 

Head : value = 10, next = addressOf-n1
n1 : value = 11, next = addressOf-n2
n2 : value = 12, next = addressOf-n3
n3 : value = 13, next = null

End TestMain

4

2 に答える 2

0

getNext()toString() メソッドでも同様に印刷しようとしています。

return "value = " +  this.value + ", next = " + getNext();

つまり、次NodetoString()メソッドも呼び出されます。次に、そのノードは ITS の次のノードのtoStringなどを呼び出します。リスト全体を印刷しないようにするには、その部分を削除する必要があります。

    return "value = " +  this.value;

次に、次のノードを出力する必要がある場合は、メソッドの外から実行する必要があります。とにかく、次のノード値を出力するのは toString() の責任ではありません。

于 2013-09-17T20:13:29.647 に答える
0

あなたが書くとき

SomeObject object = new SomeObject();
System.out.println(object);

これは、Object クラスの toString() から継承された SomeObject クラスの toString() メソッドを暗黙的に呼び出します。と同じです

SomeObject object = new SomeObject();
System.out.println(object.toString());

デフォルトでは、Object クラスには次を返す toString() メソッドがあります。

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

しかし、 toString() メソッドをオーバーライドしたため、メソッドを変更したため、「アドレス」を返すことができなくなりました! このコードを試すことができます:

public class Node {
private int value;
private Node next;
private String address=getClass().getName() + "@" + Integer.toHexString(hashCode());

public String getAddress() {
    return this.address;
}

Node(int value){
    this.value=value;
}

public int getValue() {
    return value;
}

public void setValue(int value) {
    this.value = value;
}

public Node getNext() {
    return next;
}

public void setNext(Node next) {
    this.next = next;
}

public String toString(){
    return "value = " +  this.value + ", next = " + getNextAddress();
}

private String getNextAddress() {
    if(getNext()==null){
        return "null";
    }
    return getNext().getAddress();
}


public static void main(String[] args) {
    System.out.println("Begin TestMain \n");

    Node head = new Node(10);
    Node n1 = new Node(11);
    Node n2 = new Node(12);
    Node n3 = new Node(13);

    head.setNext(n1);
    n1.setNext(n2);
    n2.setNext(n3);

    System.out.println("Head : " + head);
    System.out.println("n1 : " + n1);
    System.out.println("n2 : " + n2);
    System.out.println("n3 : " + n3);

    System.out.println("\nEnd TestMain");

}}

これはプログラミングの芸術ではありませんが、期待どおりに機能することを願っています。

于 2013-09-18T11:28:16.377 に答える