web-dev-qa-db-fra.com

Imprimer une liste chaînée avec toString

Ok les gars, alors j'essaie d'apprendre à imprimer une liste chaînée. J'ai toutes les méthodes que je devrais utiliser pour la liste, mais je n'arrive pas à comprendre comment afficher les valeurs des nœuds. Pour le moment, ma méthode principale ne contient rien, car je continuais à avoir des erreurs en essayant d'appeler des méthodes non statiques. J'ai une méthode toString qui affiche le contenu de la liste. Comment pourrais-je appeler cet objet toString pour afficher la valeur de chaque nœud? Tout conseil sera grandement apprécié.

Voici la classe de noeud:

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

Voici la classe LinkedList qui contient le principal et les méthodes pour manipuler la liste:

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;
    }
}
6
Shawn
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){
                result += current.getData();
                if(current.getNext() != null){
                     result += ", ";
                }
                current = current.getNext();
            }
            return "List: " + result;
}
6
Marin

Comme cela a été souligné dans d'autres réponses et commentaires, il vous manque un appel à la classe JVM System pour afficher la chaîne générée par votre méthode toString (). 

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

Cela fera le travail, mais je ne recommanderais pas de le faire de cette façon. Si nous examinons les javadocs de la classe Object, nous trouvons cette description pour toString ():

Retourne une représentation sous forme de chaîne de l'objet. En général, la méthode toString renvoie une chaîne qui "représente textuellement" cet objet.Le résultat devrait être une représentation concise mais informativequi est facile à lire pour une personne. Il est recommandé que toutes les sous-classes remplacent cette méthode.

L'accent ajouté ici est le mien. Vous créez une chaîne contenant l'état complet de la liste chaînée, ce à quoi quelqu'un de votre classe ne s'attend probablement pas. Je recommanderais les modifications suivantes:

  1. Ajoutez une méthode toString () à votre classe LinkedListNode.
  2. Mettez à jour la méthode toString () de votre classe LinkedList pour qu'elle soit plus concise.
  3. Ajoutez une nouvelle méthode appelée printList () à votre classe LinkedList qui fait ce que vous attendez actuellement de toString ().

Dans LinkedListNode:

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

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

}
4
TwentyMiles

Lorsque la JVM essaie d'exécuter votre application, elle appelle votre méthode principale de manière statique. quelque chose comme ça:

LinkedList.main();

Cela signifie qu'il n'y a pas d'instance de votre classe LinkedList. Pour appeler votre méthode toString(), vous pouvez créer une nouvelle instance de votre classe LinkedList.

Le corps de votre méthode main devrait donc ressembler à ceci:

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

Une solution très simple consiste à override la méthode toString() dans Node. Ensuite, vous pouvez appeler print en transmettant la variable LinkedList's head

Code: 

public class LinkedListNode {
    ...

    //New
    @Override
    public String toString() {
        return String.format("Node(%d, next = %s)", data, next);
    }
} 


public class LinkedList {

    public static void main(String[] args) {

        LinkedList l = new LinkedList();
        l.insertFront(0);
        l.insertFront(1);
        l.insertFront(2);
        l.insertFront(3);

        //New
        System.out.println(l.head);
    }
}
0
biniam

Je le fais de la manière suivante:

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