2015-11-12 22 views
0

我试图获取队列中要显示的名称列表。 当我从JOptionPane调用toString时,它不显示任何东西。我究竟做错了什么?节点字符串不显示

public String toString() { 

    String input = ""; 

    for(Node<T> current = endNode.getNext(); current != null; current = current.getNext()){ 


     input = input + current.toString() + "\n"; 

     endNode = current; 
     current = current.getNext(); 


    } 
    return input; 
} 

很奇怪,因为当我改变代码:

public String toString() { 

    int counter = 0; 
    String input = ""; 
    Node<T> current = endNode.getNext(); 
    // Loops until it goes through all stored nodes 
    if(current != null){ 

     input = input + current + "\n"; 

     endNode = current; 
     current = current.getNext(); 


    } 

    return input; 
}//end toString 

它打印出在队列中的第一个名字。为什么它对'if'而不是'for'循环起作用?

编辑:这是我的节点类:

public class Node<T> { 

private T data; 
private Node<T> next; 

public Node(T data2, Node<T> next2) { 
    data = data2; 
    next = next2; 
} 

public String toString() { 
    return data.toString(); 
} 

public T getData() { 
    return data; 
} 

public Node<T> getNext() { 
    return next; 
} 

public void setData(T data2) { 
    data = data2; 
} 


public void setNext(Node<T> next2) { 
    next = next2; 
} 

似乎有一个toString这里too..could是这个问题的根源在哪里?

+1

你调用'current.getNext( )'太频繁(在ITER部分和循环的最后一个语句中)。我也没有看到'endNode'被初始化的地方;你确定'getNext()'开始返回第一个元素吗?要查看至少一些输出,请执行'String input =“结果:”;'或其他。 – Kenney

+0

endNode是从另一个名为LinkedQueue的java文件初始化的。像这样:static LinkedQueue queue = new MyQueue <>(); 。我省略了for语句中的current = current.getNext(),并将其放在下面。当我使用sysout(current)时,它会遍历所有名字。编辑:它跳过第一个名字:l – Xirol

+0

就像@Kenney说的尝试添加String input =“Result:”;看看你是否得到任何东西 –

回答

1

首先,if变化不是简单的工作,因为if不是一个循环。我敢打赌,你正在尝试做的while

记住,

for(A;B;C){ 
    D; 
} 

能(大部分)被表示为

A; 
while (B) { 
    D; 
    C; 
} 

所以正确的方法,使您的for循环while循环是:

(你原来的for循环)

// a bit strange that you start with the "endNode", are you sure it is not "startNode"? 
// and starting with next node will cause `endNode` itself to be skipped 
// and is going to cause problem if endNode itself is null 
for(Node<T> current = endNode.getNext() 
    ; current != null 
    ; current = current.getNext()){ 
    input = input + current.toString() + "\n"; // bad idea to do string concat in loop, use StringBuilder instead 

    endNode = current; // this one makes no sense and did nothing meaningful 
    current = current.getNext(); // this is already in for-loop, 
            // having this is going to 
            // roll-forward 2 nodes each loop 
} 

所以我想正确的for循环应该是

StringBuilder sb = new StringBuilder(); 
for(Node<T> current = endNode 
    ; current != null 
    ; current = current.getNext()){ 
    sb.append(current).append("\n"); 
} 
input = sb.toString(); 

基础上换到,而转换方法,while循环应该像

StringBuilder sb = new StringBuilder(); 
Node<T> current = endNode; 
while (current != null) { 
    sb.append(current).append("\n"); 
    current = current.getNext(); 
} 
input = sb.toString(); 
+0

对不起,这是我正在使用的其他课,这就是为什么它是endNode http://pastebin.com/D0V9mR4y我知道这个名字听起来令人困惑。 – Xirol

+1

对不起,我现在无法访问pastebin:P无论如何,这不应该是答案的主要观点。我相信你可以消化答案并以你需要的方式使用它:) –