私が最も長い時間前に要求されたされている項目のための最も効率的なキックアウトポリシーをサポートするデータ構造を必要とします。例えば、私は時間に時間を要求されているアイテムの束を持っています。私はメモリを使い果たしたとき、私は私のデータ構造(ハッシュマップ)で最も古い項目を追い出すたいです。
私は、DSは、キューのようになめらかFIFOを考えていたが、私はこのような状況に対処する方法を確認していません。
- > ABCDA - >
両方の最も古く、最も新しいアイテムです。追加の場合は「」もう一度、私はそれを削除するキュー全体を検索する必要があります。それは非常に非効率的ですが、私はそれをやって、任意の効率的な方法を考えることはできません。たぶん、一番上に少なくとも1アクセスを維持し、ツリー構造のいくつかの種類?
すでにJavaでこのようなデータ構造のいずれかの実装がありますか?
LinkedHashMap
あなたは後にしている構造です。以下からのドキュメント:
特別なコンストラクタは最小最近最も最近(アクセス順)にアクセスから、そのための反復のそのエントリが最後にアクセスされた順序で連結されたハッシュマップを作成するために設けられています。マップのこの種は、LRUキャッシュの構築に適しています。
だから、あなただけ使うべき適切なコンストラクタを:
Map<K, V> map = new LinkedHashMap<>(CAPACITY, LOAD_FACTOR, true);
boolean
マップがある場合は、引数が決まりアクセス順序や挿入順序。true
アクセス順序を意味します。
あなたはLRUキャッシュとして仕事にマップしたい場合はさらに、あなたが拡張する独自のクラスを作成することができますLinkedHashMap
し、上書きされますremoveEldestEntry
方法を。ここでも、ドキュメントから:
removeEldestEntry(のMap.Entry)メソッドは、新しいマッピングがマップに追加されたときに自動的に失効マッピングを除去するためのポリシーを課すことをオーバーライドすることができます。
あなたがキャッシュのために独自のクラスを作成することができることをこの意味:
public class Cache<K, V> extends LinkedHashMap<K, V> {
private static final int MAX_ENTRIES = 100;
public Cache() {
super(SOME_INITIAL_CAPACITY, SOME_LOAD_FACTOR, true);
}
protected boolean removeEldestEntry(Entry<K, V> entry) {
return size() > MAX_ENTRIES;
}
}
使用法:
Map<K, V> map = new Cache<>();