2016-06-11 4 views
5

Ich habe Probleme mit einem Projekt, das ich für meine OOP-Klasse habe. Ich bin fast fertig, aber immer noch eine toString-Methode und eine Hauptmethode. Ich bin mir nicht sicher, wie ich das machen soll und würde mich über jede Hilfe freuen. Ich möchte meine toString Methode funktioniert wie folgt:Implementierung einer toString-Methode zum Ausdrucken einer LinkedList

Gibt eine Stringdarstellung aller Elemente in der Liste gespeichert. Eine String-Darstellung einer leeren Liste sieht wie head--><--tail Eine String-Darstellung einer nicht-leeren Liste wie folgt aussieht: 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; 
    } 

} 

und hier ist das, was ich bisher in meiner IntegerLinkedList Klasse

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

} 

Ich denke, eine Weile Schleife ist der Weg, hier zu gehen, aber dann wieder bin ich mir nicht sicher.

+0

Warum machst du 'data = data' .. aber in deiner' toString() 'Methode erzeuge einen temporären' IntegerNode' und laufe von Kopf bis Schwanz durch und höre auf, wenn es der Schwanz ist ... 'anhängt den .getData() 'jedes Mal ' – 3kings

+0

In Ihrem Code setzt' setNext() '' prev = in' und 'setPrev()' setzt auch 'prev = in'. ist es richtig? –

+0

@Matputer Danke, mein Herr. Gute Stelle. –

Antwort

5

Hier ist, wie es schreiben:

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

Als Alternative, können Sie die Logik vereinfachen kann nicht eine äußere haben, wenn sonst:

@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

Danke! Gibt es eine Möglichkeit, dies nur mit String zu tun? –

+2

@PaulDaniels Natürlich, erstellen Sie einfach einen String anstelle des StringBuilders und verwenden Sie + = anstelle von append. Beachten Sie, dass Sie curr.getData() in einen String konvertieren müssen. –

+0

Sie können auch eine toString-Methode für die IntegerNode-Klasse erstellen. Dann hast du ein rekursives toStringing. –

2

Ja, Sie eine Schleife verwenden, weil Sie über Daten unbekannter Länge iterieren wollen. Michael Markidis hat die Antwort schneller geschrieben als ich, benutze seine Lösung, jedoch würde ich einige Verbesserungen an deinem Code vorschlagen.

String h = "Head--> " + head; wird nicht funktionieren, weil Kopf ein Objekt IntegerNode ist, und Sie möchten ihre Daten zugreifen wie diese head.getData() (auch, warum Sie data = data; in dieser Methode zuweisen kann? Es sollte nur noch zurück)

Wenn Sie Möchten Sie Daten im Konstruktor zuweisen, die den gleichen Namen wie Feld haben, verwenden Sie this Schlüsselwort, um klar zu machen, was Sie zuweisen möchten. Auch null next und prev Zuordnung hat keine Bedeutung, so diesen Code

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

wie diese

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

aussehen sollte oder wenn Sie wollen dem vorherigen und dem nächsten Knoten

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

Vielen Dank! Ich werde definitiv Änderungen vornehmen. –

+0

Auch ein Kopier-/Einfügefehler in 'setNext()'. Es setzt das Feld "prev". – Andreas

0

zuweisen Wenn Sie verwenden Java 8+, StringJoiner macht es einfach.

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

Wenn nicht 8 unter Verwendung von Java, ein StringBuilder ist der richtige Weg zu gehen.
  (Führt besser als die Verwendung von String direkt)

@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 beiden Fällen verwenden Sie ein basic for loop mit einer node Variable in der Liste zu durchlaufen.


Wie für den Rest des Codes, haben Sie einige Probleme.

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

zuordnen next zu next und prev-prev ist bedeutungslos.
Das Zuweisen des Parameters zu dem Feld funktioniert nur, wenn Sie das Feld mit this. qualifizieren, andernfalls weisen Sie den Parameter sich selbst zu (bedeutungslos).

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

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

data zu data Zuordnung ist bedeutungslos.

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

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

Copy/Paste-Fehler. Sie wollten next zuweisen.

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

werden diese Methoden NullPointerException werfen, wenn Sie den letzten Wert aus der Liste abzufragen.
Fügen Sie fehlende if Anweisung hinzu.

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) "Last" bezieht sich auf die "einzige verbleibende" Wert, nicht die "tail" -Wert.