【问题标题】:toString method for a linkedList链接列表的 toString 方法
【发布时间】:2017-07-29 07:56:01
【问题描述】:

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

我不能使用任何方法,只能使用字符串连接。处理这个问题的方法非常有限。

代码如下:

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

当我运行测试时,我得到:

expected:<... 3, 0, 9, 9, 0, 3[]> but was: <... 3, 0, 9, 9, 0, 3[, ]>

这是造成这个的原因,在[,]我如何消除那个逗号?

谢谢

【问题讨论】:

  • 列表 "8, 6, 7, 5, 3, 0, 9, 9, 0, 3, 5, 7, 6, 8" 如何返回 "3, 0、9、9、0、3"?
  • @Steve Smith:我想输出只是为了更好的可读性而缩短了?但他/她不应该使用对称列表进行测试,因为该单元测试可能会隐藏意外创建的相反顺序的列表。
  • @yre ,您实际上是在列表末尾得到“[, ]”,还是只是一个逗号?

标签: java junit linked-list tostring


【解决方案1】:

你的覆盖行为有这个循环

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

当你到达结尾时,无论是否有另一个curr.next,你总是添加一个逗号

如果您可以在循环之后将其删除,否则您必须在添加逗号之前再检查一次curr.next != null 或开始将第一个字符串附加到循环之外并在内部开始与逗号连接

【讨论】:

    【解决方案2】:

    您总是将", " 字符串附加到结果中。

    • 因此,对于第一个元素,您附加 "9, "
    • 第二个是"0, "
    • 等等……
    • 最后,添加"3, "

    相反,只有在下一个元素不是 null 时,才应附加 ", "

    例如:

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

    为了节省一些比较,你应该在元素之前发出", ",并在循环之前发出第一个元素:

    //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 元素放入结果中。它是空的,还是一个错误?

    【讨论】:

    • 小提示:第二个变体并不比第一个好,因为字符串操作比对null 的简单检查要昂贵得多。但我认为这是一种更好的风格,将来您可能会编写条件比实际主体更昂贵的循环。
    • 谢谢!我尝试了这个,并从其他测试中得到了一些其他结果:预期: 但是是:
    • 第二个变种有这个效果:预期: 但是是: 第一个变种通过所有JUnits
    • 第二个变体也打印head.data。您的变体(和第一个)没有。尝试添加curr = curr.next;。我会调整答案。
    • 更新了答案。正如我在小笔记中所说,您可能会考虑将一些数据放入head 元素中。我认为这更好,但另一方面,我已经足够大,可以在一台有 16GB 未使用 RAM 的机器上关心一些浪费的字节;)&感谢您接受。
    【解决方案3】:

    在您的 While 循环中,我们到达了 curr.next != null 的最后一次迭代,我们仍然在它后面附加一个“,”。

    您可以在附加逗号之前检查 curr.next.next ==。

    【讨论】:

      猜你喜欢
      • 2021-02-07
      • 2013-04-11
      • 2015-05-02
      • 2016-03-18
      • 1970-01-01
      • 2023-03-10
      • 2013-10-14
      • 2014-05-09
      • 2011-09-13
      相关资源
      最近更新 更多