帮我实现一个可重绕的缓冲区

时间:2009-09-06 18:11:09

标签: 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.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());

我尝试使用一个包裹的List(几乎彻底改造了轮子)解决了这个问题,包裹了一个双排队(这个是完全一团糟),而我刚刚失败的第三次尝试是一个包裹的LinkedList,其中我得到了其他一切工作除了倒带()。我最近尝试的伪代码是这样的:

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(),所以基本上我第三次做了一堆冗余代码。我觉得有点沮丧,因为我从来没有对算法很好,这就是我现在来找你的原因:请帮我实现这个和/或指向我纠正原生Java API解决方案,目前我只是感到难过,因为我无法让它发挥作用。

3 个答案:

答案 0 :(得分:1)

您是否尝试使用一些其他参数包装其中一个Java Collection类型。

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

  • mark - 标记为倒带的最后一个索引
  • current - 下一个在get()
  • 上进行检索的索引

您还可以添加以下方法

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

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

答案 1 :(得分:1)

假设你有一个简单的FIFO对象来实现addgetsize操作,你可以用伪代码实现这个扩展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();
}

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

答案 2 :(得分:0)

请您详细说明要求。我无法理解倒带应该做什么。它应该添加自mark()以来添加的所有元素吗?