2

Javaでは、どのLIFOデータ構造クラスでMAXアイテムサイズを指定できます。これにより、アイテムを追加するとMAXサイズを超えるたびに、古いアイテムが自動的に破棄されます。

4

2 に答える 2

3

サブクラス化Stackして、目的の動作を取得できます。push()サイズがNより大きいかどうかを確認するためにオーバーライドし、古いアイテムを破棄する必要があります。

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

おそらくあなたが望むものに近いでしょう。

于 2012-04-28T01:36:56.367 に答える
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();

すべてのロックについて申し訳ありませんが、矛盾を避けるために必要でした。

于 2012-04-28T03:08:32.920 に答える