2013-06-07 10 views
7

ho bisogno di un HashMap o simpy un Map con un numero fisso di elementi (n) lavorando come una coda FIFO .FIFO Mappa con limitati elementi

Quindi finché il numero dell'elemento non è < = n nuovi elementi vengono semplicemente inseriti nella mappa.

Per il numero di elemento>n il primo elemento inserito viene rimosso e il più recente viene inserito nella mappa.

C'è qualcosa di simile in Java o devo implementarlo?

risposta

22

È possibile farlo con LinkedHashMap come segue:

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

Questo è un buon metodo per rimuovere la voce meno recente senza eseguire la sottoclassificazione della classe, LinkedHashMap. –

+6

@ TheOriginalAndroid, eh? Stai assolutamente sottoclasse LinkedHashMap. –

+0

è thread-safe? – fuyou001

1

Come io sono sul lato, in cui Java è la sua verbosità caratteristica migliore ... seguito funziona per me:

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

} 

Funziona anche su Google App Engine che sembra avere problemi con la classe Entry.

+0

Questa risposta ha fatto per me. big-up @yurin – qualebs