关于Java库有一个非常简单快速的问题:有没有现成的类可以实现一个具有固定最大大小的Queue
--也就是说,它总是允许添加元素,但它会默默地删除head元素,以便为新添加的元素腾出空间。
当然,手动实现它是很简单的:
import java.util.LinkedList;
public class LimitedQueue<E> extends LinkedList<E> {
private int limit;
public LimitedQueue(int limit) {
this.limit = limit;
}
@Override
public boolean add(E o) {
super.add(o);
while (size() > limit) { super.remove(); }
return true;
}
}
据我所知,在Java stdlib中没有标准实现,但在Apache Commons或类似的东西中可能有一个?
发布于 2013-01-15 00:28:43
我喜欢@FractalizeR解决方案。但是我会另外保留并返回来自super.add(o)的值!
public class LimitedQueue<E> extends LinkedList<E> {
private int limit;
public LimitedQueue(int limit) {
this.limit = limit;
}
@Override
public boolean add(E o) {
boolean added = super.add(o);
while (added && size() > limit) {
super.remove();
}
return added;
}
}
发布于 2011-04-12 23:28:40
使用组合而不是扩展(是的,我指的是扩展,因为在java中引用扩展关键字,是的,这是继承)。组合更优越,因为它完全屏蔽了您的实现,允许您在不影响类用户的情况下更改实现。
我建议尝试这样的方式(我直接在这个窗口中输入,所以买家要小心语法错误):
public LimitedSizeQueue implements Queue
{
private int maxSize;
private LinkedList storageArea;
public LimitedSizeQueue(final int maxSize)
{
this.maxSize = maxSize;
storageArea = new LinkedList();
}
public boolean offer(ElementType element)
{
if (storageArea.size() < maxSize)
{
storageArea.addFirst(element);
}
else
{
... remove last element;
storageArea.addFirst(element);
}
}
... the rest of this class
一个更好的选择(基于Asaf的答案)可能是用泛型类包装Apache Collections CircularFifoBuffer。例如:
public LimitedSizeQueue<ElementType> implements Queue<ElementType>
{
private int maxSize;
private CircularFifoBuffer storageArea;
public LimitedSizeQueue(final int maxSize)
{
if (maxSize > 0)
{
this.maxSize = maxSize;
storateArea = new CircularFifoBuffer(maxSize);
}
else
{
throw new IllegalArgumentException("blah blah blah");
}
}
... implement the Queue interface using the CircularFifoBuffer class
}
发布于 2011-04-12 23:05:55
我所知道的唯一空间有限的是BlockingQueue接口(例如,由ArrayBlockingQueue类实现)--但它们不会删除填充的第一个元素,而是阻塞put操作,直到空间释放(由其他线程删除)。
据我所知,您的简单实现是获得此类行为的最简单方法。
https://stackoverflow.com/questions/5498865
复制相似问题