2011-08-30 17 views
7

Come si può ridurre a LinkedHashMap? Ho annullato il metodo removeEldestEntry, ma questo metodo viene chiamato una sola volta quando viene inserito un nuovo valore. Quindi non vi è alcun cambiamento nel rendere la mappa più piccola in questo modo.Shrink LinkedHashMap in Java

L'LinkedHashMap dà solo la mia normale Iterator e non ha alcun metodo removeLast o listIterator, così come si possono trovare gli ultimi, diciamo 1000, voci e rimuoverli?

L'unico modo in cui riesco a pensare è l'iterazione di tutto ciò. Ma questo può richiedere anni ...

Creare una nuova mappa ogni volta che voglio rimuovere solo alcuni elementi distruggerà anche la memoria.

Forse rimuovere i primi valori di Iterator e quindi reinserirli, quando maxSize è stato ridotto nel metodo removeEldestEntry. Quindi il reinserimento darebbe il via ai valori più vecchi. Questo è un codice molto brutto ... Qualche idea migliore?

MODIFICA: Sry l'ordine di iterazione è il più vecchio al più giovane. Quindi è facile

risposta

5

L'iteratore itererà dal più vecchio al più giovane per LinekdHashMap. Se si desidera ridurre la LinkedHashMap a una dimensione, è possibile utilizzare quanto segue.

Map<K,V> lhm = 
int desiredSize = 
for(Iterator iter = lhm.keySet().iterator();iter.hasNext()) { 
    if(lhm.size() <= desiredSize) break; 
    iter.remove(); 
} 

Questo dovrebbe richiedere circa 20 ns per voce rimosso.

Problemi correlati