2012-03-20 17 views
34

क्या आप एक प्रकार का नक्शा या इसी तरह की डेटा संरचना का सुझाव दे सकते हैं जहां हम एक दूसरे से मूल्य और कुंजी दोनों को समान आसानी से प्राप्त कर सकते हैं। यही कहना है कि प्रत्येक को अन्य खोजने के लिए इस्तेमाल किया जा सकता है।बिडरेक्शनल मानचित्र

+3

आप अपनी खुद की कक्षा को दो हैमैप्स, प्रत्येक दिशा के लिए एक बना सकते हैं, और समानांतर में प्रबंधित कर सकते हैं। भंडारण स्थान और प्रदर्शन समय में स्पष्ट गिरावट दोगुनी है। –

+1

[जावा-हैशमप-हाउ-टू-गेट-की-से-वैल्यू] (http://stackoverflow.com/questions/1383797/java-hashmap-how-to-get-key-from-value) – jaco0646

+0

इसे देखें सरल उत्तर http://stackoverflow.com/a/39329515/5466401 –

उत्तर

9

सबसे आम समाधान दो नक्शे का उपयोग कर रहा है। AbstractMap को बढ़ाकर आप उन्हें एक दोस्ताना इंटरफेस के साथ आसानी से कक्षा में encapsulate कर सकते हैं।

कुछ भी नहीं लेकिन सरणियों और कस्टम कक्षाओं कुछ फायदे हैं का उपयोग कर एक नया डेटा संरचना बनाना (अद्यतन: दो नक्शे: यह अमरूद के HashBiMap कैसे कार्यान्वित किया जाता है) है। मानचित्र कार्यान्वयन डेटा संरचना के हल्के रैपर होते हैं जो कुंजी को अनुक्रमित करते हैं। चूंकि आपको दो इंडेक्स की आवश्यकता है, इसलिए आप दो पूर्ण मानचित्रों का भी उपयोग कर सकते हैं।

28

जावा की मानक लाइब्रेरी में एक बिडरेक्शनल मानचित्र नहीं है।

उदाहरण के लिए BiMap<K, V>Google Guava से उपयोग करें।

+0

@ ट्रेविस धन्यवाद, लिंक अपडेट किए गए। (इस समय एपीआई दस्तावेज़ अभी भी Google Code पर हैं)। – Jesper

+0

हाँ मैंने देखा कि उम्मीद है कि वे कहीं और सुरक्षित स्थानांतरित हो जाएंगे। – Travis

+0

@Travis वे दोनों Google से हैं, इसलिए वे शायद अपने स्वयं के प्रोजेक्ट को गड़बड़ नहीं करेंगे ... – Jesper

5

Google Guava में BiMap (बायडिरेक्शनल मानचित्र) शामिल है।

+0

आपको गिटूब को इंगित करने के लिए लिंक अपडेट करना चाहिए, लेकिन यह सोचा था कि वर्तमान लिंक काम करता है क्योंकि यह छोटा हो सकता है अभी के लिए। – Travis

+0

उचित समय में। मुझे पता है कि Google Code केवल-पढ़ने योग्य मोड में है। –

6

अपाचे कॉमन्स संग्रह 4 BidiMap पैकेज को भी आजमाएं।

10

यदि आपको लगता है कि यह कुछ तीसरी पार्टी लाइब्रेरी आयात कर रहा है। इस सरल वर्ग के बारे में कैसे।

public class BiMap<K,V> { 

    HashMap<K,V> map = new HashMap<K, V>(); 
    HashMap<V,K> inversedMap = new HashMap<V, K>(); 

    void put(K k, V v) { 
     map.put(k, v); 
     inversedMap.put(v, k); 
    } 

    V get(K k) { 
     return map.get(k); 
    } 

    K getKey(V v) { 
     return inversedMap.get(v); 
    } 

} 

सुनिश्चित करें कि के और वी कक्षा में उचित हैशकोड कार्यान्वयन है।

+0

समस्या यह है कि यह अब संग्रह नहीं है, इसलिए सभी संग्रह विधियां काम नहीं करती हैं। – Justin

+0

सच। मैं जो जोड़ना चाहता हूं उसे जोड़ने में मुझे – Javanator

2

औसत उपयोग के लिए अच्छी तरह से जहां आपको एक शब्दकोश की आवश्यकता है, मुझे एक KISS समाधान के साथ कुछ भी गलत नहीं लगता है, केवल कुंजी और मूल्य इसके विपरीत, दूसरे मानचित्र के ओवरहेड को सहेजना या उसके लिए केवल लाइब्रेरी को सहेजना उद्देश्य:

myMap.put("apple", "Apfel"); 
myMap.put("Apfel", "apple"); 
+1

ध्यान दें कि यह केवल तभी काम करता है जब कुंजी और मान एक ही प्रकार के होते हैं, और आप अब और नहीं जानते कि कौन सा कुंजी है और कौन सा मूल्य है। कुछ मामलों में कौन सा ठीक हो सकता है। – Literallie

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