2016-06-11 28 views
5

我遇到了我的OOP类的项目有问题。我差不多完成了,但仍缺少toString方法和主要方法。不太确定如何去做,并会感谢任何帮助。 我希望我的toString方法的功能如下:实现一个toString方法来打印一个LinkedList

返回存储在列表中的所有项目的字符串表示。空列表的字符串表示看起来像head--><--tail 一个非空列表的字符串表示的样子: 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; 
    } 

} 

和这里是我迄今为止在我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; 
    } 

} 

我在想一段时间的循环是去这里的路,但后来我不确定。

+0

为什么要做'data = data' ..但是在你的'toString()'方法中创建一个临时的'IntegerNode'并循环遍历从头到尾,当它是尾部时停止......附加每次都有.getData()'给它# – 3kings

+0

在你的代码中,'setNext()'设置'prev = in','setPrev()'也设置'prev = in'。这样对吗? –

+0

@Matputer谢谢先生。好点。 –

回答

5

下面是如何写:

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

作为替代方案,可以简化逻辑不具有外部的if else:

@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

谢谢!有没有什么方法可以使用String而不是? –

+2

@PaulDaniels当然,只需创建一个String来代替StringBuilder,并使用+ =而不是append。请注意,您必须将curr.getData()转换为字符串。 –

+0

您也可以为IntegerNode类创建一个toString方法。然后你有一些递归toStringing继续。 –

2

是的,你必须使用一个循环,因为你想迭代未知长度的数据。 Michael Markidis比我更快地写出答案,使用他的解决方案,但是我会建议对代码进行一些改进。

String h = "Head--> " + head;将无法​​正常工作,因为头是一个对象IntegerNode,并且要像这样访问head.getData()它的数据(也就是为什么你在这个方法分配data = data;?只应该做回)

如果您想要在构造函数中指定与字段名称相同的数据,则必须使用this关键字来明确您要分配的内容。同时指派空nextprev是没有意义的,所以这段代码

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

应该是这样的

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

,或者如果你想上一个和下一个节点分配

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

非常感谢!我一定会做出改变。 –

+0

另外,'setNext()'中的复制/粘贴错误。它设置'prev'字段。 – Andreas

0

如果你正在使用Java 8+,StringJoiner可以很容易。

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

如果不使用Java 8,StringBuilder是正确的选择。
 (执行比直接使用String更好)

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

在这两种情况下,你使用basic for loopnode变量通过列表进行迭代。


至于其余的代码,你有一些问题。

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

分配nextnextprevprev到是没有意义的。
将参数分配给该字段只有在您使用this.限定字段时才有效,否则您将为该参数分配参数(无意义)。

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

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

分配datadata是无意义的。

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

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

复制/粘贴错误。您的意思是分配到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; 
} 

这些方法将抛出NullPointerException当您轮询从列表中最后一个值。
添加缺少if声明。

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) “最后” 是指 “只剩余的” 值,而不是 “尾巴” 的值。

相关问题