0

これは私がこれまでのところです:

私が達成したいことを示すために、次のユースケース(公平なjUnitテストとして)があります。

buffer.add(o1);
assertEquals(1, buffer.size());
buffer.mark();
buffer.add(o2);
assertEquals(2, buffer.size());
buffer.add(o3);
assertEquals(3, buffer.size());
assertSame(o1, buffer.get());
assertSame(o2, buffer.get());
assertSame(o3, buffer.get());
buffer.rewind();
// NOTE: It must be possible to enter the same object multiple times
//       into the buffer.
buffer.add(o2);
assertSame(o2, buffer.get());
assertSame(o3, buffer.get());
assertSame(o2, buffer.get());

ラップされたリスト (ほとんど車輪を再発明した)、ラップされたツイン キュー (これは完全な混乱でした) を使用してこれを解決しようとしましたが、失敗した 3 回目の試みはラップされた LinkedList で、rewind( )。私の最近の試みの疑似コードは次のようなものでした:

if [backBuffer is empty]
    [get latest object]
    increment currentIndex
    if [markIndex < currentIndex]
        [put object to backbuffer]
    return object
else
    [get object from backbuffer at index backBufferIndex]
    increment backBufferIndex
    return object

これはまったく機能しませんでした。いくつかの編集の後、rewind() が呼び出されるまで読み取りを機能させることができたので、本質的に冗長なコードの束を 3 回目に作成しました。私はアルゴリズムに慣れていなかったので、この時点で少し不満を感じています。そのため、今あなたのところに来ています。これを実装するのを手伝ってください、および/またはネイティブ Java API ソリューションを修正するように私に指摘してください。現在、私はただこれを機能させることができないので、困惑しています。

4

3 に答える 3

1

addgetおよび操作を実装する単純な FIFO オブジェクトがあると仮定するとsize、次のように、この拡張 FIFO を疑似コードで実装できます。

constructor()
{
    FIFO current = new FIFO();
    FIFO alternate = new FIFO();
}

add(Object x)
{
    return current.add(x);
}

get()
{
    Object x = current.get();
    alternate.add(x);
    return x;
}

size()
{
    return current.size();
}

mark()
{
    alternate = new FIFO();
}

rewind()
{
    while (current.size > 0)
    {
        alternate.add(current.get());
    }
    current = alternate;
    alternate = new FIFO();
}

これはかなりクリーンな実装だと思います。

于 2009-09-07T03:03:49.620 に答える