2011-08-30 15 views
7

Jak można zmniejszyć LinkedHashMap? Przeanalizowałem metodę removeEldestEntry, ale ta metoda jest wywoływana tylko raz, gdy wstawiana jest nowa wartość. Nie ma więc żadnej zmiany w zmniejszaniu mapy w ten sposób.Zmniejszyć LinkedHashMap w Javie

LinkedHashMap tylko daje mój normalny Iterator i nie ma żadnego removeLast lub listIterator metody, tak jak można znaleźć ostatnie, powiedzmy 1000, wpisy i je usunąć?

Jedyny sposób, w jaki mogę myśleć, to powtarzanie całej tej sprawy. Ale to może potrwać wieki ...

Tworzenie nowej mapy za każdym razem, gdy chcę usunąć tylko kilka elementów, spowoduje również zniszczenie pamięci.

Może usunąć pierwsze wartości z Iterator, a następnie ponownie je wstawić, gdy maxSize została zmniejszona w metodzie removeEldestEntry. Następnie ponowne włożenie wyrzuciłoby najstarsze wartości. To bardzo brzydki kod ... Jakieś lepsze pomysły?

EDYCJA: Sry kolejność iteracji jest najstarsza dla najmłodszych. Więc jest to łatwe

Odpowiedz

5

Iterator przejdzie od najstarszego do najmłodszego do LinekdHashMap. Ty, jeśli chcesz zmniejszyć LinkedHashMap do rozmiaru, możesz użyć poniższych.

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

Powinno to zająć około 20 ns na wpis usunięty.