Сжатие LinkedHashMap в Java - PullRequest
       33

Сжатие LinkedHashMap в Java

7 голосов
/ 31 августа 2011

Как вы можете уменьшить LinkedHashMap?Я переопределил метод removeEldestEntry, но этот метод вызывается только один раз, когда вставляется новое значение.Таким образом, изменение размера карты таким образом не изменится.

LinkedHashMap дает мне только нормальный Iterator и не имеет removeLast или listIterator метода, так как вынайти последние, скажем 1000, записи и удалить их?

Единственный способ, которым я могу придумать, - это итерация всей этой вещи.Но это может занять много времени ...

Создание новой карты каждый раз, когда я хочу удалить только несколько элементов, также разрушит память.

Возможно, удалите первые значения Iterator, а затем вставьте их заново, когда maxSize был уменьшен в методе removeEldestEntry.Тогда переустановка выкинет самые старые значения.Это очень уродливый код ... Какие-нибудь лучшие идеи?

РЕДАКТИРОВАТЬ: Sry порядок итераций самый старый для самых маленьких.Так легко

1 Ответ

5 голосов
/ 31 августа 2011

Итератор переходит от самого старого к младшему для LinekdHashMap. Если вы хотите уменьшить LinkedHashMap до размера, вы можете использовать следующее.

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

Это должно занять около 20 нс для каждой удаленной записи.

...