一个LIFO数据结构,可容纳最多N个项目

时间:2012-04-28 01:29:07

标签: java

在java中,哪个LIFO数据结构类允许我指定一个MAX项目大小,它会在添加项目时自动丢弃旧项目,这将导致它超过MAX大小。

2 个答案:

答案 0 :(得分:3)

您可以继承Stack以获得所需的行为。您只需覆盖push()以检查大小是否大于N,并丢弃旧项目:

@Override
public void push(E elt) {
    super.push(elt);
    while (this.size() > this.maxSize) {
        this.removeElementAt(this.size() - 1);
    }
}

可能接近你想要的。

答案 1 :(得分:0)

Java中没有这样的结构。我希望这个自定义实现能满足您的需求:

    BlockingDeque<Object> deque = new LinkedBlockingDeque<Object>(32) {
        public void push(Object e) {
            final java.util.concurrent.locks.ReentrantLock lock;
            try {
                Field lockField = LinkedBlockingDeque.class.getDeclaredField("lock");
                lockField.setAccessible(true);
                lock = (ReentrantLock) lockField.get(this);
            } catch (NoSuchFieldException e1) {
                throw new RuntimeException(e1);
            } catch (SecurityException e1) {
                throw new RuntimeException(e1);
            } catch (IllegalArgumentException e1) {
                throw new RuntimeException(e1);
            } catch (IllegalAccessException e1) {
                throw new RuntimeException(e1);
            }
            lock.lock();
            try {
                if (!offerFirst(e)) {
                    pollLast();
                    offerFirst(e);
                }
            } finally {
                lock.unlock();
            }
        }
    };

然后你像堆栈一样使用它(Deque替换旧的Stack类):

    deque.push(new Object());
    Object o = deque.pop();

对于所有锁定内容感到抱歉,但需要避免不一致。