2013-06-07 4 views
7

私はHashMapを必要とするか、FIFOキューのような作業要素の固定数(N)でMapをあるSimpy。FIFO地図

要素番号が< = nになるまで、新しい要素は単にマップに入れられます。

要素番号>nの場合、最初に挿入された要素が削除され、最新のものがマップに入れられます。

Javaに類似したものがありますか、それとも実装する必要がありますか?

答えて

22

次のようにあなたがLinkedHashMapでこれを行うことができます。

new LinkedHashMap<K, V>(n) { 
    @Override protected boolean removeEldestEntry(Entry<K, V> entry) { 
    return size() > n; 
    } 
}; 
+0

これは、クラス、LinkedHashMapをサブクラス化せずに最も古いエントリを削除するための簡単な方法です。 –

+6

@ TheOriginalAndroid?あなたはLinkedHashMapを絶対にサブクラス化しています。 –

+0

スレッドセーフですか? – fuyou001

1

を私は、Javaの冗長性は、その最高機能です側、日午前のよう...以下 私の作品:

public class FifoMap extends LinkedHashMap<String, String> { 

    int max; 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public FifoMap (int max){ 
     super(max + 1); 
     this.max = max; 

    } 

    @Override 
    public String put (String key, String value) { 
     String forReturn = super.put(key, value); 
     if (super.size() > max){ 
      removeEldest(); 
     } 

     return forReturn; 
    } 

    private void removeEldest() { 
     Iterator <String> iterator = this.keySet().iterator(); 
     if (iterator.hasNext()){ 
      this.remove(iterator.next()); 
     } 
    } 

} 

Google App Engineでも動作しますが、Entryクラスに問題があるようです。

+0

この回答は私のためにしました。ビッグアップ@ゆりん – qualebs