2009-01-07 10 views
9

क्या ऐसी कोई तकनीक है कि मैं एक संख्या एन निर्दिष्ट कर सकता हूं कि जब (एन + 1) वें प्रविष्टि डाली जाती है, तो सबसे पुरानी प्रविष्टि को पहले यह सुनिश्चित किया जाता है कि हैशटेबल का आकार हमेशा एन तक सीमित है?मैं जावा हैशटेबल में प्रविष्टियों की संख्या को कैसे सीमित करूं?

+0

यह http://stackoverflow.com/questions/272674/what-is-a-data-structure-kind-of-like-a-hash-table-but-infrequently-used-keys के समान है -ar। सवाल एक समाधान प्रदान करता है। –

+0

@robhruska - क्या आपको लगता है कि यह एक डुप्लिकेट के रूप में गिना जाता है? मैं बाड़ पर हूँ। –

+0

मुझे यकीन नहीं है। दृष्टिकोण थोड़ा अलग हैं, क्योंकि यह प्रश्न "आकार सीमा" के बारे में पूछ रहा है, जबकि अन्य प्रश्न "निरंतर उपयोग" प्रविष्टियों को लक्षित करते हैं। मैं इसे खोलने का विरोध नहीं कर रहा हूं, अगर ऐसा है कि इस प्रश्न के कोण से इसे देखने वालों के लिए अधिक खोज योग्यता है। –

उत्तर

5

शायद आप LRU cache खोज रहे हैं? यहां LinkedHashMap पर आधारित एक ब्लॉग पोस्ट है।

+0

मैं यहां लिंक्ड हैशैप का उल्लेख करने आया हूं, जिसे मैंने हाल ही में एलआरयू कैश के लिए उपयोग किया था। –

0

आप अपाचे संग्रह का उपयोग करने पर विचार करना चाह सकते हैं। उनके पास एलआरयू कार्यान्वयन का एक गुच्छा है। अन्यथा, आप मानक पुस्तकालय संग्रह के लिए आसानी से एक समान रैपर लिख सकते हैं; मुझे नहीं लगता कि एक ऐसा है जिसका आप सीधे उपयोग कर सकते हैं।

0

आप डबल-एंडेड कतार, या Deque का उपयोग कर सकते हैं, और जब आप अधिकतम गणना पर हों तो केवल पहले आइटम को हटा दें।

-1

यदि आप कैशिंग कर रहे हैं तो आप वीक हैशैप या वीक रेफरेंस का उपयोग कर सकते हैं और फिर कैश के आकार के बारे में चिंता करने की आवश्यकता नहीं है।

+2

एक सामान्य गलतफहमी का प्रचार करने से बचने के लिए बस स्पष्ट करने के लिए: WeakHashMap स्वयं एलआरयू कैशिंग के लिए उपयुक्त नहीं है; यह कुंजी के लिए वीक संदर्भों का उपयोग करता है, न कि मूल्यों। यह उन वस्तुओं के बारे में मेटाडेटा रखने के लिए आदर्श है जो आपके लिए 'संबंधित' नहीं हैं; स्मृति समाप्त होने पर प्रविष्टियों को ग्रहण करने के लिए नहीं निकाला जाएगा – Cowan

27

LinkedHashMap ठीक है, removeEldestEntry विधि के लिए javadoc देखें।

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

आप हैं:

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

तुम भी निर्माता में यह निर्दिष्ट करने के द्वारा सबसे पुराने पहुँचा प्रविष्टि निकाल सकते हैं:

कुछ इस तरह चाल करना चाहिए, इस सबसे पुराने डाला प्रविष्टि निकाल देंगे समेकन की जरूरत है, इस समस्या को हल करने की कोशिश मत करो। अमरूद की CacheBuilder में एक .maximumSize() विधि है जो आपको मानचित्र के आकार को सीमित करने की अनुमति देती है, हालांकि यह मेरी समझ है कि वास्तव में सीमा तक पहुंचने से पहले पुरानी प्रविष्टियां साफ़ की जा सकती हैं।

डेटा संरचना के डिजाइन पर an interesting page है, जो पाठक को प्रभावित करना चाहिए कि Google के कार्यान्वयन से बेहतर प्रदर्शन करना कितना मुश्किल होगा। :)

संबंधित मुद्दे

 संबंधित मुद्दे