2011-08-30 28 views
7

¿Cómo se puede reducir un LinkedHashMap? Anulé el método removeEldestEntry, pero este método solo se llama una vez cuando se inserta un nuevo valor. Por lo tanto, no hay ningún cambio en hacer el mapa más pequeño de esta manera.Shrink LinkedHashMap en Java

El LinkedHashMap sólo da una normal de mi Iterator y no tiene ningún método removeLast o listIterator, así que ¿cómo se puede encontrar las últimas decir, 1000, entradas y eliminarlos?

La única forma en que puedo pensar es en recorrer todo el asunto. Pero eso puede llevar siglos ...

Crear un nuevo mapa cada vez que deseo eliminar solo algunos elementos también destruirá la memoria.

Quite los primeros valores del Iterator y luego vuelva a insertarlos cuando el maxSize se redujo en el método removeEldestEntry. Luego, la reinsección eliminaría los valores más antiguos. Este es un código muy feo ... ¿Alguna idea mejor?

EDITAR: Sry el orden de iteración es de mayor a menor. Por lo tanto, es fácil

Respuesta

5

El iterador iterará del más antiguo al más reciente para LinekdHashMap. Usted, si desea reducir el LinkedHashMap a un tamaño, puede usar lo siguiente.

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

Esto debería tomar alrededor de 20 ns por entrada eliminada.

Cuestiones relacionadas