Java 用于linkedList的toString方法

Java 用于linkedList的toString方法,java,junit,linked-list,tostring,Java,Junit,Linked List,Tostring,在linkedList类中,我的toString得到了奇怪的输出 我不能使用任何方法,只能使用字符串concat。因此,在如何处理这一问题上受到限制 代码如下: @Override public String toString() { if (head == null) { return ""; } String result = ""; Node curr = head; while (curr.next != null) { curr = curr.next; result += curr

在linkedList类中,我的toString得到了奇怪的输出

我不能使用任何方法,只能使用字符串concat。因此,在如何处理这一问题上受到限制

代码如下:

@Override
public String toString() {
if (head == null) {
return "";
}
String result = "";
Node curr = head;

while (curr.next != null) {
curr = curr.next;
result += curr.data + ", ";
}
return result;
}
我编写了一个JUnit测试:

assetsEquals(
"8,6,7,5,3,0,9, " + "9,0,3,5,7,6,8", dataTest.noOrderList().toString());
noOrderList().toString()来自:

public static noOrderList<Integer> noOrderList() {
return makeListInNoOrder(new Integer[]{ 8, 6, 7, 5, 3, 0, 9, 9, 0, 3, 5, 7, 6, 8});
公共静态noOrderList noOrderList(){
返回makeListInNoOrder(新整数[]{8,6,7,5,3,0,9,9,0,3,5,7,6,8});
当我运行测试时,我得到:

expected:<... 3, 0, 9, 9, 0, 3[]> but was: <... 3, 0, 9, 9, 0, 3[, ]>
应为:但为:
原因是什么,在[,]中,如何消除逗号


谢谢您

您的覆盖行为具有此周期

while(curr.next!=null){
curr=curr.next;
结果+=当前数据+“,”;
}

当你到达它的结尾时,你总是加一个逗号,不管是否有另一种货币


如果可以在循环结束后删除子字符串,则必须在添加逗号之前再次检查curr.next!=null,或者开始追加循环外的第一个字符串,并在While循环中开始用逗号连接,我们将进入最后一次迭代,其中curr.next!=null,并且我们仍然追加一个“,”给它


在添加逗号之前,您可以检查curr.next.next==是否正确。

您总是在结果中添加
“,”
字符串

  • 因此,对于第一个元素,添加
    “9”
  • 第二个是
    “0”
  • 等等
  • 最后,为最后一个添加
    “3”,
相反,只有当下一个元素不是
null
时,才应该附加
“,”

例如:

要保存一些比较,您应该在元素之前发出
,“
,并在循环之前发出第一个元素:

//don't print head, since that seems to be empty in your implementation.
//also make sure head does not reference `null` by accident...
if (curr.next == null)
    return result;
curr = curr.next;

//1st element after `head`
result += curr.data;

while (curr.next != null) {
    curr = curr.next;
    result += ", " + curr.data;
}

我还注意到您从未将
head
元素放入结果中。它是空的还是错误的?

列表“8、6、7、5、3、0、9、9、0、3、5、7、6、8”如何返回“3、0、9、9、0、3”的toString()“?@Steve Smith:我想输出只是为了更好的可读性而缩短了?但他/她不应该使用对称列表进行测试,因为单元测试可能会隐藏意外地以相反的顺序创建列表。@Yer,你真的得到了“[,]”在列表的末尾,或者仅仅是一个逗号?小注:第二个变量并不比第一个好,因为字符串操作比检查
null
的简单操作要昂贵得多。但我认为这是一种更好的样式,将来您可能会编写条件比实际体更昂贵的循环。谢谢!我尝试了这个,并且从其他测试中得到了一些其他结果:预期:但是是:第二个变量有这个效果:预期:但是是:第一个变量通过了所有JUnits。第二个变量也打印
头。数据
。您的变量(和第一个变量)不要。尝试添加一个
curr=curr.next;
。我会修改答案。更新答案。正如我在小便笺中所说的,你可能会考虑将一些数据放入
head
元素中。我认为这样更好,但另一方面,我已经长大了,可以在一台有16GB未使用RAM的机器上关心一些浪费的字节;)&感谢acc接受。
//don't print head, since that seems to be empty in your implementation.
//also make sure head does not reference `null` by accident...
if (curr.next == null)
    return result;
curr = curr.next;

//1st element after `head`
result += curr.data;

while (curr.next != null) {
    curr = curr.next;
    result += ", " + curr.data;
}