2012-04-28 19 views
2

LIFOデータ構造クラスによってアイテムを追加するたびに古いアイテムを自動的に破棄するMAXアイテムサイズを指定できるJavaでは、MAXサイズを超えます。最大N個のアイテムを保持するLIFOデータ構造

+0

循環バッファとして編成された配列ですか? – dasblinkenlight

+0

Javaは分かりませんが、入力、出力、およびチェックをコレクションオブジェクトのように制御するクラスを作成できます。 –

答えて

3

Stackをサブクラス化して、目的の動作を得ることができます。あなただけのサイズがNよりも大きいかどうかをチェックし、古い項目を破棄するpush()をオーバーライドする必要があります:

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

はおそらくあなたが望むものに近くなります。

+0

私はJava APIのようなデータ構造がないことに驚いています!私はちょうどurメソッドと一緒に行くと思います。 – delita

+0

これは私が同じことをしなければならなかった時に私が使ったものです。あなたはそれがなぜ必要なのか尋ねることがありますか? –

+0

私はストリーミングアップデートを持っていて、最後の10個のアップデートをバッファして最新のアップデートを取って残りをフラッシュする必要があります – delita

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(); 
      } 
     } 
    }; 

は、その後、あなたは(キューが古いStackクラスを置き換える)スタックのようにそれを使用します。

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

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

関連する問題