2010-06-22 24 views
9

MultiValueMap कक्षा (अपाचे कॉमन्स संग्रह) एक मानचित्र के साथ काम करना आसान बनाता है जिसका मूल्य संग्रह है। मैं एक ऐसे वर्ग की तलाश में हूं जो मानचित्र के साथ काम करना आसान बनाता है जिनकी चाबियां ऑब्जेक्ट्स और मान मैप्स हैं।मानचित्र डेटा संरचना का मानचित्र

मैं जावा 1.4 का उपयोग कर रहा हूं, इसलिए Google संग्रह या जेनेरिक का उपयोग नहीं कर सकता।

+0

आपको कौन सा पक्ष नक्शा बनाने की आवश्यकता है? क्या आप मानचित्र से ऑब्जेक्ट, मानचित्र पर ऑब्जेक्ट या मैप करने के लिए मानचित्र पर मानचित्रण कर रहे हैं? – MikeD

+0

क्या आप सिर्फ नक्शा <कुछ, मानचित्र> नहीं बना सकते हैं? या आप map.put (key1, key2, value) जैसे कुछ करने में सक्षम होना चाहते हैं? – Dave

+0

ऐसा नहीं है कि यह अत्यधिक प्रासंगिक है, मुझे लगता है, लेकिन मैं उत्सुक हूं: क्या कंपनी/उद्योग (विशेष रूप से आप हमें बता रहे हैं) अभी भी जावा 1.4 की आवश्यकता है? यहां तक ​​कि जावा 5 भी समाप्त हो गया है। जावा 1.4 लगभग 2 साल पहले से ही ईओएलडी रहा है। –

उत्तर

7

मानचित्रों का नक्शा वास्तव में एक पेड़-प्रकार संरचना है बिना एकल रूट नोड (साथ ही नक्शे के मानचित्रों का मानचित्र ...)।

आप Composite pattern पर देख सकते हैं जो वृक्ष संरचनाओं को लागू करने के लिए व्यापक रूप से उपयोग किया जाता है (यदि उनके घटकों का एक ही प्रकार है जो मुझे लगता है कि ऐसा नहीं है)।

एक और समाधान एक साधारण डोमेन मॉडल को लागू करना है।

school.getPupil ("John Doe").getMark ("Math") 

से

school.get ("John Doe").get ("Math") 
4

नियमित मानचित्र संग्रह इस के लिए काम करता है:: यह बहुत स्पष्ट पढ़ने के लिए और आसान की तरह कुछ बनाए रखने के लिए हो जाएगा

Map<Object,Map<Object,Object>> mapOfMaps = new LinkedHashMap<Object,Map<Object,Object>>(); 
    Object newObject = new String("object as string"); 
    mapOfMaps.put(newObject, new LinkedHashMap<Object,Object>()); 
    Map<Object,Object> objectMap = mapOfMaps.get(newObject); 

वास्तव में, आप अगर 'टाइप सुरक्षा के बारे में चिंतित नहीं हैं, आप मूल्य अनुभाग में जो कुछ भी चाहते हैं उसे डाल सकते हैं:

Map<Object,Object> mapOfWhatever = new LinkedHashMap<Object,Object>(); 
    Object newObject = new String("object as string"); 
    mapOfWhatever.put(newObject, new LinkedHashMap<Object,Object>()); 
    Map<Object,Object> objectMap = (Map<Object, Object>) mapOfWhatever.get(newObject); 
+0

आम तौर पर कोई नहीं चाहता इस बारे में परवाह करने के लिए कि क्या दिया गया (पहले) कुंजी पहले से ही 'mapOfMaps' में है, उदाहरण के लिए 'mapOfMaps.get ("firstKey") करते समय। ("secondKey", मान दें) '। उदाहरण के लिए, इस उद्देश्य के लिए पाइथन के मानचित्रों में एक ['setdefault' विधि] (http://docs.python.org/2/library/stdtypes.html#dict.setdefault) है। –

1

यदि आपके पास map:{string,map:{string,thing}} है (जानबूझकर पूरे जावा 1.4/जावा 5 व्यवसाय से बचने के लिए जावा सिंटैक्स का उपयोग करके) तो आपको यह भी विचार करना चाहिए कि आपको इसके बजाय map:{tuple:{string,string},thing} मॉडल करना चाहिए या नहीं। यदि मल्टी-स्तरीय लुकअप हावी है, तो यह एक अच्छा बदलाव है (बशर्ते आप एक अच्छा tuple लागू करें जो equals() सही ढंग से और hashCode() समझदारी से करता है) लेकिन यदि आप बहुत सारे आवेषण और हटाना कर रहे हैं तो यह कम अच्छा है।

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

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