后值在循环数组队列中无法正常工作

2019年1月22日 15点热度 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,但我无法弄清楚如何以不同的方式编写它而不弄乱循环队列公式。

任何帮助将不胜感激。谢谢!

解决方案如下:

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

在测试中表达您想要的行为,逐渐在您的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