2009-04-02 18 views
27

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

उत्तर

32

Google Guava से यह आपको लगता है कि यह आपके अनुरूप होगा।

एक बिमाप (या "बिडरेक्शनल मैप") एक नक्शा है जो इसके मूल्यों के साथ-साथ इसकी चाबियों की विशिष्टता को बरकरार रखता है। यह बाधा बिम्स को "इनवर्स व्यू" का समर्थन करने में सक्षम बनाती है, जो एक और बिटमैप है जिसमें इस बिटमैप के समान प्रविष्टियां हैं लेकिन उलट कुंजी और मानों के साथ।

या BidiMapApache Commons Collections से:

एक नक्शा है कि कुंजी और मूल्यों के बीच द्विदिश देखने की अनुमति देता है परिभाषित करता है।

यह विस्तारित Map एक मानचित्रण का प्रतिनिधित्व करता है जहां एक कुंजी एक मूल्य देख सकती है और एक मूल्य समान आसानी से एक कुंजी देख सकता है। यह इंटरफेस Map बढ़ाता है और इसलिए मानचित्र का उपयोग कहीं भी किया जा सकता है। इंटरफ़ेस एक उलटा नक्शा दृश्य प्रदान करता है, जो BidiMap के दोनों दिशाओं तक पूर्ण पहुंच को सक्षम बनाता है।

7

आप Eclipse Collections (पूर्व में जीएस संग्रह) से BiMap का उपयोग कर सकते हैं।

BiMap एक मानचित्र है जो उपयोगकर्ताओं को दोनों दिशाओं से लुकअप करने की अनुमति देता है। एक BiMap में दोनों कुंजी और मान अद्वितीय हैं।

मुख्य कार्यान्वयन HashBiMap है।

inverse()

BiMap.inverse() एक दृश्य जहां कुंजी प्रकार और मान प्रकार की स्थिति लगा दिया जाता था देता है। एक नियमित रूप से मानचित्र पर

MutableBiMap<Integer, String> biMap = 
    HashBiMap.newWithKeysValues(1, "1", 2, "2", 3, "3"); 
MutableBiMap<String, Integer> inverse = biMap.inverse(); 
Assert.assertEquals("1", biMap.get(1)); 
Assert.assertEquals(1, inverse.get("1")); 
Assert.assertTrue(inverse.containsKey("3")); 
Assert.assertEquals(2, inverse.put("2", 4)); 

put()

MutableBiMap.put() बर्ताव Map.put() तरह, सिवाय इसके फेंक देता है जब एक डुप्लिकेट मान जोड़ा गया है।

MutableBiMap<Integer, String> biMap = HashBiMap.newMap(); 
biMap.put(1, "1"); // behaves like a regular put() 
biMap.put(1, "1"); // no effect 
biMap.put(2, "1"); // throws IllegalArgumentException 

forcePut()

यह MutableBiMap.put() तरह बर्ताव करता है, लेकिन यह चुपचाप नक्शे में कुंजी-मान पेयर डालने से पहले एक ही मूल्य के साथ नक्शा प्रविष्टि निकाल देता है।

MutableBiMap<Integer, String> biMap = HashBiMap.newMap(); 
biMap.forcePut(1, "1"); // behaves like a regular put() 
biMap.forcePut(1, "1"); // no effect 
biMap.put(1, "2"); // replaces the [1,"1"] pair with [1, "2"] 
biMap.forcePut(2, "2"); // removes the [1, "2"] pair before putting 
Assert.assertFalse(biMap.containsKey(1)); 
Assert.assertEquals(HashBiMap.newWithKeysValues(2, "2"), biMap); 

नोट: मैं ग्रहण संग्रह के लिए एक committer हूँ।

1

स्वीकृत उत्तर BiMap का उल्लेख करता है, लेकिन यह Google Guava पुस्तकालयों के साथ more up-to-date बन गया है।

एक BiMap<K, V>values() एक Set

बनाने, एक Map<K, V> कि

  • आप के साथ inverse()
  • सुनिश्चित करता है कि मान अद्वितीय हैं 'उलटी "BiMap<V, K> देखने की अनुमति देता है तो, आप इस तरह के कोड के साथ समाप्त कर सकते हैं:

    इस वस्तु के साथ कुछ चेतावनियां:

    • आप में गैर-अद्वितीय मान जोड़ने के लिए सक्षम नहीं होगा, या आप एक IllegalArgumentException मिलेगा। आप forcePut(key, value) का उपयोग कर सकते हैं, लेकिन यह override the existing key-value pair होगा।
संबंधित मुद्दे