我有这个代码用于添加:
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,因为它增加了公式,但我无法弄清楚如何以不同的方式编写它而不会弄乱循环队列公式。
任何帮助将不胜感激。谢谢!
答案 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块之外时,如果数据结构为空,则添加两次新元素。