对于我的数据结构类,我们的任务是实现一个使用已经创建的基于数组的队列的PriorityQueue类。除克隆方法外,一切都在PriorityQueue类中工作。当克隆方法被激活时,即使正在克隆的队列中有数据,也不会返回任何内容。 PriorityQueue类使用ArrayQueues数组。我刚从我的班级复制了构造函数和克隆方法。
感谢您的帮助
private ArrayQueue<E>[] queues;
private int manyItems;
private int highest;
public PriorityQueueArray(int a_highest) {
manyItems = 0;
highest = a_highest;
queues = new ArrayQueue[a_highest+1];
for(int i = 0; i <= a_highest; i++) {
queues[i] = new ArrayQueue();
}
}
public PriorityQueueArray<E> clone() {
PriorityQueueArray<E> answer;
try{
answer = (PriorityQueueArray<E>) super.clone();
} catch (CloneNotSupportedException e) {
// This exception should not occur. But if it does, it would probably indicate a
// programming error that made super.clone unavailable. The most common error
// The most common error would be forgetting the "Implements Cloneable"
// clause at the start of this class.
throw new RuntimeException
("This class does not implement Cloneable");
}
for(int i = 0; i <= highest; i++) {
answer.queues[i] = queues[i].clone();
}
return answer;
}
答案 0 :(得分:1)
尝试使用
@Override
public Object clone() throws CloneNotSupportedException {
// your method here.
...
}
作为方法签名。看起来好像你没有使用稍微不同的签名正确覆盖克隆方法。请参阅@Override注释的information,了解如何使用编译器来解决类似的问题。
有关克隆方法的详细信息,请参阅here。
答案 1 :(得分:0)
我认为问题在于queues
没有被正确克隆。试试这个:
public PriorityQueueArray<E> clone() {
PriorityQueueArray<E> answer;
answer.manyItems = manyItems;
answer.highest = highest;
answer.queues = new ArrayQueue<E>[queues.length]; // This is the key!
for (int i = 0; i <= highest; i++) {
answer.queues[i] = queues[i].clone();
}
return answer;
}
您的原始代码依赖于super.clone()
来完成大量工作,但该方法的默认版本执行浅层克隆,并且不会复制queues
数组。所以你最终会得到一个与原始队列共享队列数组的“克隆”。这意味着将共享ArrayQueue
实例,并且会发生奇怪的事情......
(鉴于我们需要手动new
queues
数组,最简单的方法是手动复制其他2个字段。)
我们需要查看您的单元测试,以确定如何/为什么会导致您看到的症状。
答案 2 :(得分:0)
如果您看到Priority Queue的声明,则它不会实现clonable接口。
public class PriorityQueue<E> extends AbstractQueue<E> implements Serializable