这是我到目前为止的地方:
我有以下用例(作为公正的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解决方案,目前我只是感到难过,因为我无法让它发挥作用。
答案 0 :(得分:1)
您是否尝试使用一些其他参数包装其中一个Java Collection类型。
例如,创建一个包装ArrayList的新类。除了数组列表,还要保留私有成员变量
您还可以添加以下方法
还有一些细节需要解决(如何处理无效索引,最初设置的标记是什么等),但这可能会给你一个良好的开端。
答案 1 :(得分:1)
假设你有一个简单的FIFO对象来实现add
,get
和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();
}
我认为这是一个相当干净的实现。
答案 2 :(得分:0)
请您详细说明要求。我无法理解倒带应该做什么。它应该添加自mark()以来添加的所有元素吗?