2009-01-07 12 views
9

(n + 1) inci giriş eklendiğinde, ilk önce en eski girdinin kaldırılması, böylece hashtable'ın boyutunun her zaman n ile sınırlı olmasını sağlayacak şekilde bir sayı n belirtebileceğim bir teknik var mı?Bir java karma girişindeki giriş sayısını nasıl sınırlarım?

+0

Bu http://stackoverflow.com/questions/272674/what-is-a-data-structure-kind-of-like-a-hash-table-but-infrequently-used-keys benzer -ar. Soru bir çözüm sağlar. –

+0

@robhruska - bunun bir kopya olarak sayıldığını düşünüyor musunuz? Ben çitdeyim. –

+0

Emin değilim. Perspektifler biraz farklıdır, çünkü bu soru “boyut sınırı” hakkında sorgularken, diğer soru “seyrek olarak kullanılan” girdileri hedeflemektedir. Açık bırakmaya karşı değilim, sadece eğer bu sorunun bakış açısına bakanlar için daha fazla arama yapılabilir. –

cevap

5

Sen belki LRU cache arıyoruz? İşte LinkedHashMap tabanlı bir blog yazısı.

+0

Buraya bir LRU önbelleği için son zamanlarda kullandığım LinkedHashMap'den bahsetmeye geldim. –

0

Apache Koleksiyonlarını kullanmayı düşünebilirsiniz. Bir grup LRU uygulaması var. Aksi takdirde, standart kütüphane koleksiyonları için benzer bir sarıcı kolayca yazabilirsiniz; Doğrudan kullanabileceğinizi düşünmüyorum. Eğer maksimum sayımda olduğunuzda

0
Bir çift uçlu kuyruk kullanabilirsiniz

veya Deque ve sadece ilk öğeyi kaldırın.

-1

Eğer bir WeakHashMap veya WeakReference kullanabilirsiniz önbelleğe ve sonra önbellek boyutu hakkında endişelenmenize gerek ediyorsanız.

+2

Sadece genel bir yanlış anlamadan kaçınmak için açıklığa kavuşturmak için: WeakHashMap, kendi başına LRU önbelleğe alma için uygun DEĞİLDİR; DEĞERLER için değil, KEYS için WeakReferences kullanır. Size ait olmayan nesneler hakkında meta verileri tutmak için idealdir; bellek bittiğinde girişler atılacak değil – Cowan

27

LinkedHashMap tam olarak, removeEldestEntry yöntemi için javadoc bakınız yapar.

Map map = new LinkedHashMap(16, 0.75f, true) { 
     @Override 
     protected boolean removeEldestEntry(Entry eldest) { 
      return size() > N; 
     } 
    }; 
0

Eğer:

Map map = new LinkedHashMap() { 
    @Override 
    protected boolean removeEldestEntry(Entry eldest) { 
     return size() > N; 
    } 
}; 

Ayrıca yapıcı bunu belirterek eski erişilen girişi kaldırabilirsiniz: Böyle

şey hile yapmak gerekir, bu en eski eklenen girdiyi kaldıracaktır eşzamanlılık ihtiyaçları var, bu sorunu kendiniz çözmeye çalışmayın. Guava'nın CacheBuilder, bir haritanın büyüklüğünü sınırlamanıza izin veren bir .maximumSize() yöntemine sahiptir, ancak eski girdilerin gerçekten sınıra ulaşmadan önce temizlenebildiğini anladım.

an interesting page Google'ın uygulanması daha iyi yapmak ne kadar zor olacağını okuyucuda etkilemek gerektiğini veri yapının tasarımı, üzerinde var. :)

İlgili konular