2015-11-12 2 views
0

Я пытаюсь получить список имен в очереди для отображения. Когда я вызываю toString из JOptionPane, он ничего не показывает. Что я делаю не так?Узел Строка не отображается

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»?

EDIT: Вот мой Узла класс:

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 () 'слишком часто (в разделе' for' ITER и в последнем утверждении цикла). Я также не вижу, где инициализируется 'endNode'; вы уверены, что 'getNext()' начинает возвращать первый элемент? Чтобы увидеть хотя бы некоторый вывод, выполните 'String input =" Результат: ";' или что-то. – Kenney

+0

endNode инициализируется из другого java-файла с именем LinkedQueue. например: static LinkedQueue queue = new MyQueue <>(); , Я пропустил current = current.getNext() из оператора for и оставил один под ним. Когда я использовал sysout (текущий), он зациклился на всех именах просто отлично. EDIT: он пропускает первое имя: l – Xirol

+0

Как @Kenney говорил, попробуйте добавить String input = "Result:"; чтобы увидеть, если вы получите что-нибудь обратно –

ответ

1

Во-первых, вариация if не работает просто потому, что if не является циклом. Я уверен, вы пытаетесь сделать while

Имейте в виду, что

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

может (в основном) можно представить в виде

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

так правильный способ сделать свой цикл на время цикла является:

(Ваш оригинальный цикл)

// 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 
} 

поэтому я полагаю правильным цикл должен быть

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

База на для к в то время как метод преобразования, в то время как цикл должен выглядеть

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

жаль, что я не могу получить доступ к пастебину сейчас: P В любом случае, это не должно быть основной точкой ответа. Я считаю, что вы можете переварить ответ и использовать его так, как вам нужно :) –

Смежные вопросы