2011-06-06 6 views
5

हैलो
यदि आप एक कुंजी-मान-जोड़ी की एक विशिष्ट मूल्य के लिए एक HashMap<String,String> खोज, आप लिख सकते हैं निम्नलिखित:हैश मैप.containsKey() - कक्षा के लिए कैसे खोज करें?

myHashMap.containsKey(myString); 

लेकिन मैं इसे कैसे प्रबंधित कर सकते, तो कुंजी एक स्ट्रिंग नहीं है? मेरे पास एक वर्ग है जो इस तरह दिखता है:

public class Kategorie implements Comparable { 
    private String name; 

    public Kategorie() { 
     super(); 
    } 

    public Kategorie(String name) { 
     setName(name); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public int compareTo(Object o) { 
     if (!(o instanceof Kategorie)) 
      throw new ClassCastException(); 

     Kategorie k = (Kategorie)o; 
     String name = k.getName(); 
     return this.getName().compareTo(name); 

    } 
} 

मानचित्र में मैंने इस प्रकार की कुंजी और श्रेणियों को "श्रेणी" बचाया।

mapKategorieDEundEN.put(new Kategorie(strName_de), new Kategorie(strName_en)); 

बाद में कोड में, मैं जांचना चाहता हूं कि एक विशिष्ट स्ट्रिंग के साथ कोई कुंजी है या नहीं।

if (mapKategorieDEundEN.containsKey(searchString)) { 

... काम नहीं करता है, क्योंकि कुंजी एक स्ट्रिंग लेकिन एक "Kategorie" नहीं है, कि स्पष्ट है।

if (mapKategorieDEundEN.containsKey(new Kategorie(searchString))) { 

... भी काम नहीं करता:

तो मैं कुछ इस तरह की कोशिश की। मुझे लगता है कि यह कुछ भी नहीं मिला क्योंकि वस्तु "मूल" वस्तु नहीं है बल्कि एक नया है।

इस मामले में, क्या मैं बिल्कुल शामिल है का उपयोग कर सकता हूं या क्या मुझे हैश मैप पर लूप का उपयोग करना है?

उत्तर

5

आपको कक्षा equals और hashCode ओवरराइड करना चाहिए, इसके बाद यह काम करेगा।

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

+0

+1: हैश मैप के लिए जावाडोक के अनुसार। –

+0

@downvoter, कृपया अपने हिट-एंड-रन डाउनवोट को समझाएं। –

+0

हां, यह जानना अच्छा होगा कि मेरा जवाब क्यों कम हो गया था। – Kaj

1

हैश मैप hashCode() और equals() का उपयोग करता है। आपको उन्हें लागू करना होगा। यदि आप नहीं जानते कि कैसे। अपने आईडीई (ग्रहण) की जांच करें आमतौर पर उन्हें आपके लिए उत्पन्न कर सकते हैं।

0

यदि आप अपनी compareTo विधि का उपयोग करके अपनी ऑब्जेक्ट्स एक्सेस करना चाहते हैं, तो आपको हैशकोड/बराबर आधारित मानचित्र का उपयोग नहीं करना चाहिए, लेकिन एक सॉर्टेड मैप, जैसे TreeMap (या ConcurrentSkipListMap) का उपयोग नहीं करना चाहिए।

इसमें अतिरिक्त लाभ है कि यह रेंज-आधारित प्रश्नों को सक्षम करता है (उदाहरण के लिए "मुझे इस से बड़ी श्रेणियां दें"), लेकिन सरल (सरल) के लिए ओ (लॉग)) थोड़ा धीमा है get हैश-आधारित पहुंच की तुलना में उपयोग करता है (एक अच्छा हैश कोड के साथ, निरंतर नहीं)।

एक सामान्य उपयोग वर्ग के लिए, हैशकोड/बराबर और तुलना दोनों को परिभाषित करने के लिए समझदार होगा, तो वर्ग का उपयोगकर्ता तय कर सकता है कि किस प्रकार का मानचित्र उपयोग करना है। (यदि आपकी ऑब्जेक्ट्स को सॉर्ट करने के विभिन्न तरीके हैं, तो बेहतर तुलनात्मक ऑब्जेक्ट्स प्रदान करें।)

एक साइड टिप्पणी के रूप में, आपको Comparable लागू नहीं करना चाहिए, लेकिन Comparable<Kategorie>। फिर आपकी compareTo विधि इस तरह दिखेगी:

public int compareTo(Kategorie k) { 
    String name = k.getName(); 
    return this.getName().compareTo(name); 
} 
संबंधित मुद्दे