后置值在循环阵列队列中无法正常工作

时间:2011-10-11 22:48:34

标签: java arrays queue circular-buffer

我有这个代码用于添加:

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,因为它增加了公式,但我无法弄清楚如何以不同的方式编写它而不会弄乱循环队列公式。 任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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块之外时,如果数据结构为空,则添加两次新元素。