Hashtable с ограниченным размером? - PullRequest
1 голос
/ 29 марта 2012

Для управления некоторым кешем мне нужен своего рода Hashtable с возможностью удалять самые старые элементы, чтобы сохранить последние элементы MAXSIZE в таблице.Мне нужно программировать это на Java, но любой алгоритм с псевдокодом тоже подойдет.

public interface LimitedHashtable<K, V> {
    void put(K k, V v); // will remove the oldest element from the table if size > MAXSIZE
    V get(K k);
}

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 29 марта 2012

Взгляните на LinkedHashMap с переопределенным removeEldestEntry - если он вернет size() > MAXSIZE, у вас будет то, что вы хотите.Один из конструкторов LinkedHashMap также имеет логическое значение, которое указывает, означает ли «самая старая» запись ту, которая была добавлена ​​давным-давно, или ту, к которой был обращен самый давний раз.

3 голосов
/ 29 марта 2012

Рассмотрите возможность использования CacheBuilder в Guava, который предлагает maximumSize() среди других опций.Обратите внимание, что это поведение более детально, чем то, что вы можете искать:

Указывает максимальное количество записей, которое может содержать кэш.Обратите внимание, что кэш может удалить запись до того, как этот предел будет превышен.Поскольку размер кеша приближается к максимальному, кеш удаляет записи, которые с меньшей вероятностью будут использоваться снова.Например, кэш может удалить запись, потому что она не использовалась в последнее время или очень часто.

3 голосов
/ 29 марта 2012

Единственный способ, которым я знаю, это сохранить очередь ключей в вашем хэше и использовать ее для удаления ключей, когда таблица и очередь становятся слишком большими

1 голос
/ 29 марта 2012

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

...