【问题标题】:Java Double Ended Queue toString Method overwriting left elementJava双端队列toString方法覆盖左元素
【发布时间】:2018-07-13 01:24:02
【问题描述】:

我创建了一个双端队列,我想打印出队列的内容。我创建了一个 toString 方法,但是当我向左侧添加一个元素时,它会覆盖当前的前(左)元素。 例如

 System.out.println(myDeq);
 myDeq.addFront(7);
 myDeq.addRight(12);
 System.out.println(myDeq);
 myDeq.addFront(15);
 System.out.println(myDeq);

所以我的输出是

<>
<7,12>
<15,12>

但我想要

<15,7,12>

我的 toString 方法是:

public String toString()
    { StringBuffer sb = new StringBuffer("<");
        QCell<T> l = frontCell;
        QCell<T> r = backCell;
        while (l != null && r != null)
        { sb.append(l.data +"," + r.data + ",");
            l = l.next;
            r = r.next;
        }
        return(sb+">");
    }

我添加到左边的代码是: @Override

public void addFront(T x) {
    QCell<T> theCell= new QCell<T>(x);
    if (frontCell == null)
        frontCell = backCell = theCell;
    else {
        frontCell.next = theCell;
        frontCell = theCell;
    }
}

我不确定是我的 toString 方法覆盖了它还是我的 addFront 代码不正确。

【问题讨论】:

  • 为什么不为您的队列编写单元测试并找出答案?
  • @lance-java 这不是我的 add 方法,我测试过。这是我的 toString 方法,但我不知道为什么它会覆盖。
  • 谁写的并不重要。编写一个调用add()toString() 的单元测试,并做出一些应该为真的断言。继续修复代码,直到测试变为绿色。

标签: java collections queue deque


【解决方案1】:

您 addFront 是错误的,因为您将 frontCell 的 next 设置为 theCell。但随后将 frontCell 重新分配为 theCell。所以原来的 frontCell 已经不存在了。首先将其保存在 tempCell 中。

public void addFront(T x) {
    QCell<T> theCell= new QCell<T>(x);
    QCell<T> tempCell;
    if (frontCell == null)
        frontCell = backCell = theCell;
    else {
        tempCell = frontCell;
        frontCell = theCell;
        frontCell.next = tempCell;
    }
}

而且你的 backCell 将是 lastCell 所以不要像r = r.next;那样做,因为它应该并且永远是空的;它应该是r.previous

而是使用像这样从前到后遍历的单边循环。

public String toString()
    { StringBuffer sb = new StringBuffer("<");
        QueueCell<T> l = frontCell;
        while (l != null)
        { sb.append(l.data +",");
            l = l.next;
        }

        return(sb+">");
    }

【讨论】:

    【解决方案2】:

    不应该这样吗:

    frontCell.next = theCell;
    

    改成这个?

    theCell.next = frontCell;
    

    【讨论】:

    • 没有区别。我很确定这是我的 toString 方法不正确,因为如果我测试我的 removeLeft 方法,7 仍然存在。
    • 是的,它不必要地复杂,并且不清楚您要实现什么。你不能从前到后遍历列表吗? r 变量有什么用?
    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    相关资源
    最近更新 更多