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、実際よりも 1 つ多くの値が得られます。また、ある配列から別の配列に値をコピーすると、1 つの値をスキップしているという値があります。私はすべてが の値に関係していることを知っており、何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はオフセットです - 2 番目の長さとして使用することはできませんarraycopy()
  • r内部配列のサイズを変更するときに更新する必要があります
  • 評価の順序が変更され、保存r にインクリメントされますitem
于 2011-10-12T00:15:38.520 に答える
0

最後の 3 行が 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++;
    }
}

3 行が else ブロックの外側にある場合、データ構造が空の場合に備えて、新しい要素を 2 回追加していました。

于 2011-10-11T23:05:10.200 に答える