0

我有这个代码来添加:

public void add(AnyType item){
    if(isEmpty()){
        q[f]=item;
    }
    else{
        if(size==q.length){
            AnyType[] copyQ = (AnyType[]) new Object[q.length*2];
            System.arraycopy(q, f, copyQ, 0, q.length-f);
            System.arraycopy(q, 0, copyQ, q.length-f, r);
            f = 0;
            q = copyQ;
        }
    }
    q[r]=item;
    r = (r+1)%(q.length);
    size++;
}

但是当我想获得它的价值时,r它给了我比实际价值多一个的价值。此外,当我将值从一个数组复制到另一个数组时,会有一个值跳过一个值。我知道一切都与价值有关r = (r+1)%(q.length);,我已经研究了好几个小时,但无法弄清楚。将值分配给 q[r] 后,即使它只是第一个值,我尝试获取 r 应该在哪里的值它给了我 1,因为它是由公式增加的,但我无法弄清楚如何在不弄乱循环队列公式的情况下以不同的方式编写它。任何帮助将不胜感激。谢谢!

4

2 回答 2

1

单元测试是你的朋友!:-)

将您想要的行为表达为测试,逐渐在您的方法中建立复杂性,add()直到一切正常。我为你的循环缓冲区做了它,工作add()看起来像这样:

public void add(AnyType item){
    if(isEmpty()){
        q[f]=item;
    } 
    else {
        if (size == q.length) {
            AnyType[] copyQ = (AnyType[]) new Object[q.length*2];
            System.arraycopy(q, f, copyQ, 0, q.length-f);
            System.arraycopy(q, 0, copyQ, q.length-f, (r + 1));
            f = 0;
            r = q.length -1;
            q = copyQ;
        }
    }

    r = (r+1)%(q.length); 
    q[r]=item;
    size++;
}

注意区别:

  • r是一个偏移量 - 你不能在第二个中使用它作为长度arraycopy()
  • r调整内部数组大小时需要更新
  • 更改了评估顺序,在存储r 之前递增item
于 2011-10-12T00:15:38.520 回答
0

是因为最后三行应该在 else 块中吗?尝试如下代码:

public void add(AnyType item){
    if(isEmpty()){
        q[f]=item;
    }
    else{
        if(size==q.length){
            AnyType[] copyQ = (AnyType[]) new Object[q.length*2];
            System.arraycopy(q, f, copyQ, 0, q.length-f);
            System.arraycopy(q, 0, copyQ, q.length-f, r);
            f = 0;
            q = copyQ;
        }
    q[r]=item;
    r = (r+1)%(q.length);
    size++;
    }
}

当这三行在 else 块之外时,您将添加两次新元素,以防数据结构为空。

于 2011-10-11T23:05:10.200 回答