PriorityQueue中的clone()方法实现

时间:2011-04-18 00:47:38

标签: java priority-queue

对于我的数据结构类,我们的任务是实现一个使用已经创建的基于数组的队列的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;
}

3 个答案:

答案 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