Java 帮助我实现一个可倒带的缓冲区
这就是我目前所处的位置: 我有以下用例(作为公正的jUnit测试)来展示我想要实现的目标: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,
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列表匹配程度如何,考虑扩展列表类型之一而不是包装一个。