2016-12-19 6 views
5

से मैं ऐसे hashmapHashMap से मूल्य प्राप्त उपयोगकर्ता वस्तु

HashMap<Man, Double> d = new HashMap<>(); 

तो मैं इसे में नई जोड़ी को जोड़ने की है।

d.put(new Man("John"), 5.); 

मैं इस जोड़ी को इस मानचित्र से कैसे पुनर्प्राप्त कर सकता हूं? मैं करने की कोशिश की:

Man man = new Man("John"); 
System.out.println(d.get(man)); 

लेकिन एक परिणाम के रूप में मैं null है, जबकि मैं 5 की उम्मीद।

+0

चाहते हो सकता है प्राप्त करने की कोशिश करने के लिए? शायद काम कर सकते हैं .. –

+0

@Eran nope। मैं यह कैसे कर सकता हूं? –

+0

@RomaKarageorgievich शायद आपको 'हैश मैप' जावाडोक पढ़ना शुरू करना चाहिए। या इसे गूगल। – Eran

उत्तर

5

यह केवल आपके HashMap को समझने के लिए भले ही वे एक ही उदाहरणों नहीं हैं, वे एक ही सामग्री है और एक ही रूप में विचार किया जाना चाहिए कि अनुमति देने के लिए यदि आप तरीकों equals(Object obj) और अपनी कक्षा Man में hashCode() ओवरराइड काम कर सकते हैं अपने मानचित्र में कुंजी।

तो यह सोचते हैं कि आपकी कक्षा Man है ऐसा ही कुछ:

public class Man { 
    private final String name; 

    public Man(final String name) { 
     this.name = name; 
    } 
    ... 
} 

आप अपने आईडीई आप के लिए तरीकों उत्पन्न करने के लिए कहते हैं, तो आप कुछ इस तरह मिलेगा:

@Override 
public boolean equals(final Object o) { 
    if (this == o) return true; 
    if (o == null || this.getClass() != o.getClass()) return false; 
    final Man man = (Man) o; 
    return Objects.equals(this.name, man.name); 
} 

@Override 
public int hashCode() { 
    return Objects.hash(this.name); 
} 
1

हैश मैप ठीक काम कर रहा है। सिर्फ इसलिए कि आप एक ही नाम के साथ दो नई वस्तुएं बनाते हैं, इसका मतलब यह नहीं है कि कंप्यूटर सोचता है कि वे एक ही वस्तु हैं।

निम्नलिखित का प्रयास करें:

man1 = new Man("John"); 
man2 = new Man("John"); 

if (man1 == man2) { 
    System.out.println("Equal"); 
} else { 
    System.out.println("Not equal"); 
} 

आप मिल जाएगा "इसके बराबर नहीं" क्योंकि कंप्यूटर अगर वे वास्तव में एक ही वस्तु है, सिर्फ एक ही नाम नहीं देखने के लिए जाँच कर रहा है।

हर बार जब आप "नया" कीवर्ड का उपयोग कर रहे हैं, तो आप एक नई वस्तु घोषित कर रहे हैं और कंप्यूटर इसे एक अद्वितीय पता देता है।

इस प्रयास करें:

man1 = new Man("John"); 

HashMap<Man, Double> myList = new HashMap<>(); 
myList.put(man1, "5.00"); 
System.out.print.ln(myList.get(man1)); 

आप आप देखेंगे अब मिल "5.00" वापस क्योंकि आप वास्तव में यह सही वस्तु मानचित्र में महत्वपूर्ण है कि दे रहे हैं।

आपको मैन्युअल रूप से परिभाषित करने की आवश्यकता होगी कि आप कैसे निर्णय लेते हैं कि दो "पुरुष" बराबर हैं यदि आप इस तरह के व्यवहार को काम करना चाहते हैं। आप एक कुंजी के रूप में पूर्ण नाम का उपयोग करना बेहतर हो सकते हैं, क्योंकि यह आमतौर पर अद्वितीय होने वाला है, और आपके लिए लागू करने के लिए कम काम है।

+0

* आप इसे बिना किसी त्रुटि के संकलित करेंगे, क्योंकि कंप्यूटर उन "जॉन्स" को अलग-अलग इकाइयों के रूप में मान्यता देता है। * किस प्रकार की कंपाइलर त्रुटि की अपेक्षा की जाएगी? – shmosel

+0

मैंने इसे अपना उदाहरण अधिक स्पष्ट बनाने के लिए संपादित किया – mstorkson

+0

बेहतर, लेकिन मुझे लगता है कि 'man1.equals (man2) 'अधिक प्रासंगिक होगा। यह संपूर्ण उत्तर संदर्भ समानता की अवधारणा पर अनुचित जोर देता है, जो ओपी के नियंत्रण से बाहर है, और संभवतः पहले ही समझा जा सकता है। – shmosel

2

आपको कुछ अद्वितीय होना चाहिए जो ऑब्जेक्ट Man को परिभाषित करता है। आपके मामले में, ऐसा लगता है - name

तो तुम equals() विधि और इसी तरह hashcode() अद्वितीय पहचानकर्ता के रूप name का उपयोग कर अपने Man कक्षा में तरीकों को ओवरराइड।

name एक स्ट्रिंग है जिसे आप String कक्षा में समान तरीकों से कार्य को सौंप सकते हैं।

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