Java 帮助我实现一个可倒带的缓冲区

Java 帮助我实现一个可倒带的缓冲区,java,algorithm,buffering,Java,Algorithm,Buffering,这就是我目前所处的位置: 我有以下用例(作为公正的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,

这就是我目前所处的位置:

我有以下用例(作为公正的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());
我曾尝试使用包装列表(几乎彻底改造了轮子)、包装双队列(这是一个完全混乱的队列)来解决这个问题,而我刚刚失败的第三次尝试是一个包装链接列表,在该列表中,除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
如果[backBuffer为空]
[获取最新对象]
增量电流指数
如果[标记索引<当前索引]
[将对象放入backbuffer]
回波信号
其他的
[从索引backBufferIndex处的backbuffer获取对象]
增量backBufferIndex
回波信号

这根本不起作用,经过一些编辑之后,我设法让reading开始工作,直到调用了rewind(),所以本质上我第三次编写了一堆冗余代码。在这一点上,我确实感到有点沮丧,因为我从来都不擅长算法,这就是我现在来找你们的原因:请帮助我实现这一点和/或向我指出如何纠正本机Java API解决方案,目前我只是感到困惑,因为我无法实现这一点。

请您详细说明一下需求。我无法理解倒带应该做什么。是否应添加自mark()以来添加的所有元素

您是否尝试过用一些附加参数包装一种Java集合类型

例如,创建一个包装ArrayList的新类。除数组列表外,保留私有成员变量

  • 标记-标记为倒带的最后一个索引
  • 当前-在get()上检索的下一个索引
您还可以添加以下方法

  • get()-返回数组列表中当前索引处的对象,并以当前索引递增
  • 标记()-将标记设置为当前值
  • rewind()-将当前设置为标记的值

仍然有一些细节需要解决(如何处理无效索引,标记最初设置为什么,等等),但这可能会给您一个好的开始。

假设您有一个简单的FIFO对象,该对象实现了
添加
获取
大小
操作,您可以在伪代码中实现此扩展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();
}

我认为这是一个相当干净的实现。

将rewind()与InputStreams中的reset()一样考虑;它将标记(由标记()设置)到缓冲区中的指定点,并继续从该点读取对象,而实际的Addio:():S仍然将新对象添加到整个事件的结尾。此外,取决于实现与java列表匹配程度如何,考虑扩展列表类型之一而不是包装一个。