2017-08-10 57 views
7

पर इंगित करने वाले एकाधिक हैशैप्स मेरे पास कई फ़ाइलें हैं जिनमें कुंजी = मान स्ट्रिंग जोड़े हैं। चाबियाँ फाइलों के बीच समान हैं, लेकिन मान अलग-अलग हैं। प्रत्येक फ़ाइल में ऐसे 1000 जोड़े के जोड़े हो सकते हैं।जावा - एक ही कुंजी

मैं प्रत्येक फ़ाइल को एक अलग हैशप, यानी map<KeyString, ValueString> में स्टोर करना चाहता हूं, इसलिए यदि पांच फाइलें हैं, तो पांच हैशैप्स होंगे।

प्रत्येक हैशैप में कुंजियों को डुप्लिकेट करने से बचने के लिए, क्या प्रत्येक मानचित्र एक ही कुंजी को संदर्भित करना संभव है? ध्यान दें कि एक बार कुंजी में कुंजी जोड़े जाने के बाद, इसे हटाया नहीं जाएगा।

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

मैं एक सरल/बेहतर दृष्टिकोण के लिए खुला हूं।

+0

सुझावों के लिए धन्यवाद। मैंने स्ट्रिंग पूलिंग के साथ जाने का फैसला किया, चाहे इंटर्न() या मैन्युअल पूलिंग के साथ (या जावा अगर पहले से ही डिफ़ॉल्ट रूप से इंटर्न कर रहा है तो कोई भी नहीं)। फिर से धन्यवाद। – Timegate

उत्तर

1

कुंजी में पढ़ने के बाद, आप String.intern() का उपयोग कर सकते हैं। जब कॉल किया जाता है, तो यह क्या होता है:

  • स्ट्रिंग को आंतरिक पूल में जोड़ें यदि यह पहले से मौजूद नहीं है;
  • पूल से समकक्ष स्ट्रिंग को वापस कर देता है यदि यह पहले से मौजूद है।

String#intern Javadoc

+0

अच्छा पकड़ लें! इसके बारे में नहीं पता था! – xenteros

+0

@kewne plz नहीं ... यह कुछ गलत होने पर डीबग करने के लिए एक दुःस्वप्न होगा। आम तौर पर 'इंटर्न' अत्यधिक निराश होता है – Eugene

+1

@ यूजीन मैं मानता हूं कि विशेष मामलों में 'इंटर्न' का उपयोग किया जाना चाहिए लेकिन ऐसा लगता है। यह उचित क्यों नहीं है? – kewne

1

सबसे पहले, मुझे आपकी स्ट्रिंग कुंजी के कई उदाहरणों को संग्रहीत करने में समस्या दिखाई नहीं दे रही है। 5 HashMap एस * 1000 कुंजी बहुत छोटी संख्या है, और आपके पास स्मृति समस्याएं नहीं होनी चाहिए।

कहा यही कारण है, अगर आप अभी भी डुप्लिकेट String रों से बचना चाहते हैं, तो आपको पहले HashMap अन्य HashMap रों के लिए तो आप ठीक उसी कुंजी बना सकते हैं और।

उदाहरण के लिए, मान लें कि map1 पहला HashMap है और यह पहले फ़ाइल की सामग्री से पहले ही पॉप्युलेट हो चुका है।

आप 2 HashMap पॉप्युलेट करने के लिए कुछ इस तरह लिख सकते हैं:

for (String key : map1.keySet()) { 
    map2.put (key, someValue); 
} 

बेशक आप पहली बार नक्शे के प्रत्येक key दूसरा नक्शा की इसी मूल्य के लिए खोजने के लिए होगा। अगर कुंजी इनपुट फ़ाइलों में एक ही क्रम में संग्रहीत नहीं हैं, तो इसके लिए कुछ प्रारंभिक सॉर्टिंग चरण की आवश्यकता हो सकती है।

+0

या कुंजी के रूप में 'एनम' ... यदि वह वास्तव में चाहता है कि – Eugene

2

मैं एक सरल दृष्टिकोण के बारे में सोच सकता हूं। Map<String, String>Map<String, List<String> या guava से सीधे MultiMap<String, String> के बारे में सोचने के बजाय।

प्रत्येक कुंजी प्रत्येक फ़ाइल में है और सभी मान हैं, तो आपको पहले फ़ाइल से मान 0 सूचकांक में, दूसरे से 1 सूचकांक में स्टोर कर सकता है आदि

यह काम नहीं चाहते हैं, तो मैं एक Collection<Map<String, String> की सिफारिश , तो आप अपने Map एस के माध्यम से फिर से शुरू करने में सक्षम हैं। फिर जब आप Map एस में से किसी एक में मूल्य जोड़ना चाहते हैं, तो सभी keySet एस के माध्यम से जाएं और उनमें से एक में वह कुंजी है, तो बस इस keySet से वापस ऑब्जेक्ट के साथ रखें।

अन्य समाधान HashSet है जो पहले से ही रखे गए हैं। यह अधिक कुशल होगा।

0

शायद आप एक static Map<> अद्वितीय Integers को अपनी चाबी नक्शा और अपने नक्शे के लिए कुंजी के लिए उन Integer रों उपयोग करने के लिए पकड़ सकता है?

कुछ की तरह:

class KeySharedMap<K,V> { 
    // The next key to use. Using Atomics for the auto-increment. 
    static final AtomicInteger next = new AtomicInteger(0); 
    // Static mapping of keys to unique Integers. 
    static final ConcurrentMap<Object,Integer> keys = new ConcurrentHashMap<>(); 
    // The map indexed by Integer from the `keys`. 
    Map<Integer, V> map = new HashMap<>(); 


    public V get(Object key) { 
     return map.get(keys.get(key)); 
    } 

    public V put(Object key, V value) { 
     // Associate a unique integer for each unique key. 
     keys.computeIfAbsent(key,x -> next.getAndIncrement()); 
     // Put it in my map. 
     return map.put(keys.get(key),value); 
    } 
} 

हाँ, मुझे लगता है कि K यहां इस्तेमाल किया नहीं है, लेकिन मुझे लगता है यह आवश्यक हो सकता है अगर आप Map<K,V> को लागू करना चाहते हैं।

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