2015-02-20 5 views
9

के लिए जावा डेटा संरचना सबसे अच्छी है, मैं जावा के लिए अपेक्षाकृत नया हूं और मेरे पास एक सवाल है कि मेरे मामले के लिए किस प्रकार की डेटा संरचना सबसे अच्छी होगी। मेरे पास डेटा का एक सेट है जो अनिवार्य रूप से कुंजी-मूल्य जोड़े हैं, हालांकि प्रत्येक मान एकाधिक कुंजी के अनुरूप हो सकता है और प्रत्येक कुंजी एकाधिक मानों के अनुरूप हो सकती है। एक सरल उदाहरण होगा:दो-तरफा बहु-मूल्य मैपिंग

  • लाल एप्पल
  • ग्रीन एप्पल
  • लाल स्ट्राबेरी
  • ग्रीन अंगूर
  • बैंगनी अंगूर

ऊपर के उदाहरण को देखते हुए, मुझे वापस लौटने में सक्षम होना चाहिए कि मेरे पास कौन से रंग सेब हैं और/या मेरे पास कौन से लाल फल हैं। वास्तविक डेटा इनपुट फ़ाइल के आधार पर गतिशील रूप से उत्पन्न होगा जहां प्रत्येक सेट 100-100,000 मानों से कहीं भी होगा और प्रत्येक मान दूसरे सेट में सैकड़ों मानों के अनुरूप हो सकता है।

इस डेटा को स्टोर और पार्स करने का सबसे प्रभावी तरीका क्या होगा? मैं बाहरी डेटाबेस जैसे कुछ के बजाय जावा के मूल के रूप में एक समाधान पसंद करूंगा।

This question संबंधित है, लेकिन मुझे यकीन नहीं है कि मेरे मामले में समाधान कैसे लागू करें, मुझे यह दिया गया है कि मुझे दोनों दिशाओं में प्रत्येक कुंजी को एकाधिक मान असाइन करने होंगे।

+0

मानचित्र के बारे में कैसे? http://docs.oracle.com/javase/7/docs/api/java/util/Map.html – Koogle

+0

यह प्रश्न भी है: http://stackoverflow.com/questions/2571652/java-many-to- कई-एसोसिएशन-मानचित्र – Josh

+0

@ जोश - धन्यवाद, मुझे अपनी खोज में यह प्रश्न नहीं मिला। मैं यह देखने के लिए समाधान देखता हूं कि क्या मैं उन्हें अपने डेटा के लिए सफलतापूर्वक कार्यान्वित कर सकता हूं। – user4588937

उत्तर

1

मेरा सुझाव है कि आप Guava's Table का उपयोग करें संरचना। अपनी पंक्ति कुंजी और फल के रूप में रंग का उपयोग अपनी कॉलम कुंजी या दूसरी तरफ के रूप में करें। विशेष रूप से, HashBasedTable आपके मामले के लिए उपयुक्त है।

आपके उपयोग के मामले में, आपको मूल्यों के लिए कुछ भी स्टोर करने की आवश्यकता नहीं होगी। हालांकि, इन Table एस null मानों की अनुमति नहीं देते हैं। आप एक डमी Boolean या किसी अन्य सांख्यिकीय उपयोगी मूल्य है, यानी की तारीख और प्रविष्टि, उपयोगकर्ता, रंग/फल जोड़े की संख्या का कोई समय इत्यादि

Table इस्तेमाल कर सकते हैं इस तरह के column() और row() तरीके के रूप में आप की जरूरत है, नहीं है। ध्यान रखें कि दस्तावेज़ कहते हैं कि इन संरचनाओं को पंक्ति पहुंच के लिए अनुकूलित किया गया है।यह आपके लिए ठीक हो सकता है यदि आप दूसरे की तुलना में एक कुंजी से अधिक तक पहुंचने की योजना बना रहे हैं।

3

चूंकि आपके पास Map में डुप्लिकेट कुंजी नहीं हो सकती हैं, तो आप Map<Key, List<Value>> बना सकते हैं, या यदि आप कर सकते हैं, तो Guava's Multimap का उपयोग करें।

Multimap<String, String> multimap = ArrayListMultimap.create(); 
multimap.put("Red", "Apple"); 
multimap.put("Red", "Strawberry"); 

System.out.println(multimap.get("Red")); // Prints - [Apple, Strawberry] 

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

फिर भी, आप मानचित्र को फिर से और ऑब्जेक्ट के लिए कुंजी ढूंढकर खुद को उलट कर सकते हैं।

+1

* का उपयोग करें * लेकिन समस्या यह है कि आप नहीं पूछ सकते किसी दिए गए ऑब्जेक्ट की चाबियाँ। "* जैसे लगता है कि इसे BiMultiMap द्वारा हल किया जाएगा। यह सुनिश्चित नहीं है कि यह मौजूद है, लेकिन यही वह है जिसे इसे कहा जाएगा। या नोड नामों पर अनुक्रमित एक निर्देशित ग्राफ। –

+0

क्या आप इसे प्राप्त करने के लिए इनमें से दो कस्टम ऑब्जेक्ट में लपेट नहीं सकते –

0

आप अपने स्वयं के कस्टम डेटा संरचना

public class MultiValueHashMap<K, V> { 
    private HashMap<K, ArrayList<V>> multivalueHashMap = new HashMap<K, ArrayList<V>>(); 

    public static void main(String[] args) { 
     MultiValueHashMap<String, String> multivaluemap = new MultiValueHashMap<String, String>(); 
     multivaluemap.put("Red", "Apple"); 
     multivaluemap.put("Green", "Apple"); 
     multivaluemap.put("Red", "Strawberry"); 
     multivaluemap.put("Green", "Grapes"); 
     multivaluemap.put("Purple", "Grapes"); 

     for(String k : multivaluemap.keySet()){ 
      System.out.println(k + " : " + multivaluemap.get(k).toString()); 
     } 
    } 

    public void put(K key, V value){ 
     if (multivalueHashMap.containsKey(key)){ 
      ArrayList<V> values = multivalueHashMap.get(key); 
      values.add(value); 
     }else{ 
      ArrayList<V> values = new ArrayList<V>(); 
      values.add(value); 
      multivalueHashMap.put(key, values); 
     } 
    } 

    public Set<K> keySet(){ 
     return multivalueHashMap.keySet(); 
    } 

    public ArrayList<V> get(K key){ 
     return multivalueHashMap.get(key); 
    } 
} 

बना सकते हैं उत्पादन

लाल होना चाहिए: [एप्पल, स्ट्राबेरी]

बैंगनी: [अंगूर]

ग्रीन [ ऐप्पल, अंगूर]

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