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