2013-10-09 7 views
5

Ok ragazzi, quindi sto cercando di imparare come stampare una lista collegata. Ho tutti i metodi che avrei bisogno di usare per la lista, ma non riesco a capire come visualizzare i valori dei nodi. Al momento non c'è nulla nel mio metodo principale perché continuavo a ricevere errori nel tentativo di chiamare i metodi non statici nel main. Ho un metodo toString che mostra il contenuto della lista. Come andrei a chiamare questo toString per visualizzare il valore di ogni nodo? Qualsiasi consiglio sarà molto apprezzato.Stampa di un elenco collegato tramite toString

Qui è la classe del nodo:

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

Ecco la classe LinkedList che contiene il principale e metodi per manipolare la lista:

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; 
    } 
} 
+2

Si crea un'istanza della classe e chiamare 'toString() 'su di esso. –

+1

Chiama il metodo 'toString()'. Non vedo alcun problema in questo. – Prateek

+0

Come intendete. Se chiamo "toString()" nel mio metodo principale, viene visualizzato un errore che dice "Impossibile creare un riferimento statico al metodo non statico toString()? – Shawn

risposta

6
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() { 
      String result = ""; 
      LinkedListNode current = head; 
      while(current.getNext() != null){ 
       current = current.getNext(); 
       result += current.data + ", "; 
      } 
      return "List: " + result; 
} 
1

Quando i JVM tenta di eseguire l'applicazione, è chiama il tuo metodo principale in modo statico; qualcosa di simile:

LinkedList.main(); 

Questo significa che non c'è un'istanza della classe LinkedList. Per chiamare il tuo metodo toString(), puoi creare una nuova istanza della tua classe LinkedList.

Così il corpo del tuo metodo di main dovrebbe essere simile a questo:

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()); 
} 
3

Come è stato sottolineato in alcune altre risposte e commenti, quello che manca qui è una chiamata al sistema JVM classe per stampare la stringa generata dal metodo toString().

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

Questo avrà il compito, ma non consiglierei di farlo in quel modo. Se diamo un'occhiata a javadocs per la classe Object, troviamo questa descrizione per toString():

Restituisce una rappresentazione di stringa dell'oggetto. In generale, il metodo toString restituisce una stringa che "rappresenta testualmente" questo oggetto. Il risultato dovrebbe essere una rappresentazione concisa ma informativa che è facile da leggere per una persona. Si raccomanda che tutte le sottoclassi superino questo metodo.

L'enfasi aggiunta è la mia. Stai creando una stringa che contiene l'intero stato dell'elenco collegato, che probabilmente qualcuno che sta usando la tua classe non si aspetta. Vorrei raccomandare le seguenti modifiche:

  1. Aggiungere un metodo toString() alla classe LinkedListNode.
  2. Aggiornare il metodo toString() nella classe LinkedList per essere più conciso.
  3. Aggiungi un nuovo metodo chiamato printList() alla tua classe LinkedList che esegue ciò che stai attualmente aspettando toString().

In LinkedListNode:

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

In 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(); 
    } 

} 
0

lo faccio nel modo seguente:

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(); 
}