2012-04-28 46 views
2

在java中,哪個LIFO數據結構類允許我指定最大項目大小,只要添加項目就會自動丟棄舊項目,這會導致項目超過MAX大小。保存最多N個項目的LIFO數據結構

+0

將數組組織爲一個循環緩衝區?.. – dasblinkenlight 2012-04-28 01:31:56

+0

我不知道Java,但可以編寫一個類來控制輸入,輸出和檢查,如集合對象。 – 2012-04-28 01:33:59

回答

3

您可以繼承Stack以獲得所需的行爲。你只需要重寫push()檢查大小是否大於N,並丟棄舊項目:

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

可能會接近你想要什麼。

+0

我很驚訝java api中沒有這樣的數據結構!我猜想我會用你的方法去。 – delita 2012-04-28 02:55:24

+0

這是我在做同樣的事情時所使用的。我可以問你爲什麼需要它嗎? – 2012-04-28 02:56:19

+0

我有流媒體更新,需要緩衝最近10次更新,並採取最新的更新和沖洗其餘 – delita 2012-04-28 03:33:23

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

對不起,所有的鎖的東西,但它需要以避免不一致。

相關問題