java - 帮我实现一个可倒带的缓冲区

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

我曾尝试使用包装列表(几乎是重新发明了轮子)、包装双队列(这个完全是一团糟)来解决这个问题,而我刚刚失败的第三次尝试是包装的 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() 被调用,所以基本上我第三次制作了一堆冗余代码。在这一点上我确实感到有点沮丧,因为我从来都不擅长算法,这就是我现在来找你的原因:请帮助我实现这个和/或指出我纠正 native Java API 解决方案,目前我只是感到难过,因为我无法让它工作。

最佳答案

假设您有一个简单的 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();
}

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

关于java - 帮我实现一个可倒带的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1386296/

相关文章:

Java:对于参数类型 double、double[],运算符 - 未定义

ios - AVPlayer(和 MPMoviePlayerController)试图缓冲整个(流媒体)视频,内存不足

Java 最终性能/优化

java - 使用 ProGuard 后异常跟踪不显示私有(private)方法的行号

c - 求 Z(n) 中 x 的乘法逆元,扩展欧几里德算法

algorithm - 对双值列表进行排序

javascript - 在坐标的相对位置显示矩阵的算法

rx-java - 在 rxjava 中重试缓冲区

php - 在 PHP 中关闭连接但继续执行脚本

java - 如何让扫描仪读取预设变量