2016-06-11 32 views
5

Ho problemi con un progetto che ho per la mia classe OOP. Ho quasi finito, ma manca ancora un metodo toString e un metodo principale. Non sono proprio sicuro di come procedere e apprezzerei qualsiasi aiuto. Voglio che il mio metodo toString di funzionare come segue:Implementazione di un metodo toString per stampare una LinkedList

Restituisce una rappresentazione in formato stringa di tutti gli elementi memorizzati nella lista. Una rappresentazione di stringa di una lista vuota assomiglia head--><--tail Una rappresentazione di stringa di una lista non vuota assomiglia: head-->134<-->-8<-->42<-->1<--tail

public class IntegerNode{ 

    private IntegerNode next; 
    private IntegerNode prev; 
    private int data; 

    public IntegerNode(int data){ 
     next = next; 
     prev = prev; 
     data = data;  
    } 

    public int getData(){ 
     data = data; 
     return this.data; 
    } 

    public IntegerNode getNext(){ 
     return next; 
    } 

    public IntegerNode getPrevious(){ 
     return prev; 
    } 

    public void setNext(IntegerNode in){ 
     prev = in; 
    } 

    public void setPrevious(IntegerNode in){ 
     prev = in; 
    } 

} 

e qui è quello che ho finora nella mia classe IntegerLinkedList

public class IntegerLinkedList{ 

    private IntegerNode head; 
    private IntegerNode tail; 

    public IntegerLinkedList(){ 
     head = null; 
     tail = null; 
    } 

    public void addFirst(int x){ 
     IntegerNode nH = new IntegerNode(x); 
     if (head == null) { 
      head = nH; 
      tail = nH; 
     }else{ 
      head.setPrevious(nH); 
      nH.setNext(head); 
      head = nH; 

     } 
    } 

    public void addLast(int x){ 
     IntegerNode t = new IntegerNode(x); 
     if (tail == null){ 
      head = t; 
      tail = t; 
     }else{ 
      tail.setNext(t); 
      t.setPrevious(tail); 
      tail = t; 
     } 
    } 

    public int peekFirst(){ 
     return head.getData(); 
    } 

    public int peekLast(){ 
     return tail.getData(); 
    } 

    public String toString(){ 
     if (head == null && tail == null){ 
      String empty = "head--><--tail"; 
      return empty; 
     }else{ 
      String h = "Head--> " + head; 
      String t = tail + " <--Tail"; 
      String m = " <--> "; 
      // while(IntegerNode.getNext() != null) 
      //} 
      //return h + m + t; 

     } 
    } 

    public int pollFirst(){ 
     int x = head.getData(); 
     head = head.getNext(); 
     head.setPrevious(null); 
     return x; 
    } 

    public int pollLast(){ 
     int x = tail.getData(); 
     tail = tail.getPrevious(); 
     tail.setNext(null); 
     return x; 
    } 

} 

Sto pensando che un ciclo while è la strada da percorrere qui, ma di nuovo non ne sono sicuro.

+0

Perché fai 'data = data' .. ma nel tuo metodo' toString() 'crea un' IntegerNode 'temporaneo e passa da capo a coda e si ferma quando è la coda ... 'aggiungendo .getData() 'ad esso ogni volta' – 3kings

+0

Nel tuo codice,' setNext() 'sta impostando' prev = in' e 'setPrev()' sta anche impostando 'prev = in'. è giusto? –

+0

@Matputer Grazie signore. Buon posto –

risposta

5

Ecco come scriverlo:

@Override // <-- Annotate that you are overriding the toString() method 
public String toString(){ 
    if (head == null && tail == null){ 
     String empty = "head--><--tail"; 
     return empty; 
    }else{ 
     StringBuilder sb = new StringBuilder(); 
     sb.append("Head-->"); 

     IntegerNode curr = head; 
     sb.append(curr.getData()); 
     curr = curr.getNext(); 
     while(curr != null) { 
      sb.append("<-->"); 
      sb.append(curr.getData()); 
      curr = curr.getNext(); 
     } 
     sb.append("<--tail"); 
     return sb.toString(); 
    } 
} 

In alternativa, è possibile semplificare la logica di non avere un esterno se il resto:

@Override // <-- Annotate that you are overriding the toString() method 
public String toString(){ 
    StringBuilder sb = new StringBuilder(); 
    sb.append("Head-->"); 

    IntegerNode curr = head; 

    if (curr == null) 
    { 
     sb.append("<--tail"); 
     return sb.toString(); 
    } 

    sb.append(curr.getData()); 
    curr = curr.getNext(); 
    while(curr != null) { 
     sb.append("<-->"); 
     sb.append(curr.getData()); 
     curr = curr.getNext(); 
    } 
    sb.append("<--tail"); 

    return sb.toString(); 
} 
+0

Grazie! C'è un modo per farlo usando solo String invece? –

+2

@PaulDaniels Ovviamente basta creare una stringa al posto di StringBuilder e usare + = invece di append. Nota che dovrai convertire il curr.getData() in una stringa. –

+0

È anche possibile creare un metodo toString per la classe IntegerNode. Quindi hai qualche ricorsivo in corso. –

2

Sì, è necessario utilizzare un ciclo, perché si desidera eseguire un'iterazione su dati di lunghezza sconosciuta. Michael Markidis ha scritto la risposta più velocemente di me, usa la sua soluzione, tuttavia suggerirei alcuni miglioramenti al tuo codice.

String h = "Head--> " + head; non funziona, perché la testa è un oggetto IntegerNode, e si desidera accedere ai suoi dati come questo head.getData() (anche perché si assegna data = data; in questo metodo? Che dovrebbe fare solo tornare)

Se vuoi assegnare i dati nel costruttore che hanno lo stesso nome del campo, usare deve usare la parola chiave this per chiarire cosa vuoi assegnare. assegnando anche nullo next e prev non ha alcun significato, per cui questo codice

public IntegerNode(int data){ 
    next = next; 
    prev = prev; 
    data = data;  
} 

dovrebbe assomigliare a questa

public IntegerNode(int data){ 
    this.data = data;  
} 

o se si desidera assegnare il nodo precedente e successivo

public IntegerNode(int data, IntegerNode next, IntegerNode prev){ 
    this.next = next; 
    this.prev = prev; 
    this.data = data;  
} 
+0

Grazie mille! Farò sicuramente dei cambiamenti. –

+0

Inoltre, un errore di copia/incolla in 'setNext()'. Imposta il campo 'prev'. – Andreas

0

Se stai usando Java 8+, StringJoiner lo rende facile.

@Override 
public String toString() { 
    StringJoiner joiner = new StringJoiner("<-->", "head-->", "<--tail"); 
    for (IntegerNode node = this.head; node != null; node = node.getNext()) 
     joiner.add(String.valueOf(node.getData())); 
    return joiner.toString(); 
} 

Se non si utilizza Java 8, un StringBuilder è la strada giusta da percorrere.
  (si comporta meglio che usare String direttamente)

@Override 
public String toString() { 
    StringBuilder buf = new StringBuilder("head-->"); 
    boolean sep = false; 
    for (IntegerNode node = this.head; node != null; node = node.getNext()) { 
     if (sep) 
      buf.append("<-->"); 
     buf.append(node.getData()); 
     sep = true; 
    } 
    return buf.append("<--tail").toString(); 
} 

In entrambi i casi, si utilizza un basic for loop con una variabile node per scorrere l'elenco.


Come per il resto del codice, ci sono alcuni problemi.

public IntegerNode(int data){ 
    next = next; 
    prev = prev; 
    data = data;  
} 

Assegnazione next a next e prev-prev è priva di significato.
L'assegnazione del parametro al campo funziona solo se si qualifica il campo con this., altrimenti si assegna il parametro a se stesso (senza significato).

public IntegerNode(int data){ 
    this.data = data;  
} 

public int getData(){ 
    data = data; 
    return this.data; 
} 

Assegnazione data a data è priva di significato.

public int getData(){ 
    return this.data; 
} 

public void setNext(IntegerNode in){ 
    prev = in; 
} 

errore di copia/incolla. Volevi assegnare a next.

public void setNext(IntegerNode in){ 
    next = in; 
} 

public int pollFirst(){ 
    int x = head.getData(); 
    head = head.getNext(); 
    head.setPrevious(null); 
    return x; 
} 

public int pollLast(){ 
    int x = tail.getData(); 
    tail = tail.getPrevious(); 
    tail.setNext(null); 
    return x; 
} 

Questi metodi gettare NullPointerException quando si effettua il prelevamento l'ultimo valore dalla lista.
Aggiungere la dichiarazione if mancante.

public int pollFirst(){ 
    int x = head.getData(); 
    head = head.getNext(); 
    if (head == null) 
     tail = null; 
    else 
     head.setPrevious(null); 
    return x; 
} 

public int pollLast(){ 
    int x = tail.getData(); 
    tail = tail.getPrevious(); 
    if (tail == null) 
     head = null; 
    else 
     tail.setNext(null); 
    return x; 
} 

1) "ultimo" si riferisce al valore "unico rimasto", non il valore "coda".