2012-03-19 12 views
5

संपादित करें: समस्या को ठीक से समझाया गया है।क्या हैशसेट्स को हैश मैप में चाबियाँ मिल सकती हैं? यदि कोई विकल्प नहीं है तो

मेरे पास एक हैशप है जहां मैं एक साथ देखे गए शब्दों (कुंजी) और उन रेखाओं को सेट करना चाहता हूं जिनमें उन्हें एक साथ देखा गया था (मान)। ,

  1. आम, केला, सेब

  2. सेब, केला

  3. आड़ू वालरस

  4. :

    HashMap<HashSet<String>, HashSet<Integer>> hm= ... 
    
    आदानों के लिए

    : यह संरचना मैं के साथ आया है

  5. वालरस, आड़ू

जैसा कि मैंने इसे पढ़ा है, लाइन से लाइन, मैं लाइन में शब्दों के संयोजन से नई अस्थायी कुंजी (हैशसेट अभी तक हैशप में डाला नहीं गया) बना देता हूं। प्रत्येक अस्थायी कुंजी लाइन में शब्दों के सबसेट का हैशसेट है। एक अस्थायी कुंजी पहले से ही मेरे hashmap, में मौजूद है मैं द्वारा

if(hashmap.containsKey(hashset)) 

जाँच जो मैं बस उस कुंजी का मान संबद्ध करने के लिए नई लाइन जोड़ने के लिए, यदि नहीं, तो मैं hashmap में एक नई प्रविष्टि बनाने के लिए और यह ध्यान रखना।

कोई भी बिंदु मैं किसी मौजूदा कुंजी को बदल नहीं सकता। मैं केवल हैमपैप में उनके संबंधित मानों को अद्यतन करता हूं।

मेरी hashmap, फ़ाइल को पढ़ने के अंत में, इस

[सेब, केला] की तरह कुछ = [1,2]

दिखना चाहिए

[आड़ू, वालरस] = [3,4]

...

समस्या

कि कोड की

if(hashmap.containsKey(hashset)) 

टुकड़ा ALW नहीं है ऐस मौजूदा कुंजी का पता लगाता है। ऐसा क्यों है? क्या इस संरचना की अनुमति नहीं है?

आप

+1

क्या आपने इसे आजमाया है? – pcalcao

+0

लाइन 5 को 'आड़ू, वालरस' के साथ मैप नहीं किया जाएगा? और 'आम' के बारे में क्या? – Thomas

+0

@pcalcao हाँ। यह अजीब व्यवहार करता है। कभी-कभी यह अस्तित्व में मौजूद सेट का पता लगाता है, कभी-कभी नहीं। मैं बस हैश मैप हैशसेट को संभाल सकता है या नहीं, इसकी पुष्टि करना चाहता हूं। – student101

उत्तर

3

आप कर सकते हैं धन्यवाद, लेकिन एक बार आप एक HashMap करने के लिए एक कुंजी के रूप में एक HashSet जोड़ लिया है आप इसे फिर से संशोधित नहीं करना चाहिए, के रूप में HashSet.hashCode() बदल सकता है और आप अपने HashSet फिर कभी नहीं मिलेगा। दूसरे शब्दों में, आप ऐसा कुछ कर रहे हैं, सुनिश्चित करें कि अपनी चाबी अपरिवर्तनीय HashSets (भी Matt's answer here देखें)

एक वैकल्पिक के साथ एक MultiKeycommons collections

+0

मेरे द्वारा +1, लेकिन उसे एक विकल्प का उपयोग क्यों करना चाहिए? वह 'हैशसेट' – Cratylus

+0

@ उपयोगकर्ता384706 में 'बराबर' और 'हैशकोड' को ओवरराइड कर सकता है: ओपी ने संभावित विकल्प –

+0

ठीक से पूछा लेकिन वह केवल 'हैशसेट' मैं किसी कारण के बारे में नहीं सोच सकता कि यह – Cratylus

8

से यह काम करना चाहिए साथ MultiKeyMap उपयोग करने के लिए है हो सकता है , लेकिन आपको चाबियों की व्यवहार्यता के लिए बाहर देखने की जरूरत है। यदि आपने कभी भी चाबियों में से किसी एक की सामग्री को बदल दिया है, तो उसका हैशकोड बदल जाएगा, और आपका नक्शा अजीब चीजें करना शुरू कर देगा।Map के लिए जावाडोक से:

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

इससे बचने के लिए तुरंत निर्माण पर Collections.unmodifiableSet() साथ कुंजी को रैप, या बस अमरूद से ImmutableSet का उपयोग करें।

+0

+1 मानचित्र Javadoc –

+0

@matt हाय का उल्लेख करने के लिए, मैंने अब सवाल फिर से लिखा है। यह बहुत स्पष्ट रूप से समझाया नहीं गया था। किसी भी बिंदु पर मैं चाबियाँ बदलता हूं, मैं केवल उन मानों को अद्यतन करता हूं जिनके लिए हैशप में बिंदु है। – student101

1

आपके पास जो समस्या है वह @Lukas ans @Matt द्वारा अच्छी तरह से समझाया गया है।
मुझे लगता है कि आप Hashset बनाने के लिए सजावट पैटर्न का विस्तार या उपयोग करके दूर हो सकते हैं जो equals और hashCode को सामग्री से स्वतंत्र तरीके से ओवरइड करता है।

इस तरह आप किसी विशिष्ट समस्या के लिए तीसरे पक्ष के जार पर निर्भरता शुरू करने से बच सकते हैं

+0

यह एक दिलचस्प विकल्प है! ओपी के पाठ से बताना मुश्किल है, चाहे वह वांछित परिणाम देगा, हालांकि ... –

+0

मैं सोच रहा था कि क्या कुछ गड़बड़ है जिसे मैं नहीं देख रहा हूं।IMHO अतिरिक्त पुस्तकालयों को पेश करने से बचने के लिए अच्छा है यदि आप वास्तव में उनका उपयोग नहीं करते हैं – Cratylus

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