2009-06-06 6 views
5

मैं हैश मैप में डेटा संग्रहीत कर रहा हूं (कुंजी: स्ट्रिंग, मान: ऐरेलिस्ट)। जिस हिस्से में मुझे परेशानी हो रही है, वह एक नया ऐरेलिस्ट "वर्तमान" घोषित करता है, स्ट्रिंग "dictCode" के लिए हैश मैप की खोज करता है और यदि पाया जाता है कि लौटाए गए मूल्य ArrayList के रूप में वर्तमान सेट होता है।हैश मैप (कुंजी: स्ट्रिंग, मान: ऐरेलिस्ट) ArrayList के बजाय ऑब्जेक्ट देता है?

ArrayList current = new ArrayList();  
if(dictMap.containsKey(dictCode)) { 
    current = dictMap.get(dictCode); 
} 

"वर्तमान = ..." रेखा की एक संकलक त्रुटि देता है:

Error: incompatible types 
found : java.lang.Object 
required: java.util.ArrayList 

मुझे यह समझ नहीं है ... है कि HashMap एक ऑब्जेक्ट ArrayList के बजाय मैं संग्रहीत इसमें मूल्य के रूप में? मैं इस ऑब्जेक्ट को ArrayList में कैसे परिवर्तित करूं?

धन्यवाद।

+0

प्रश्न को स्पष्ट करने के लिए हैश मैप घोषणा जोड़ें। – Jorn

उत्तर

33

हैशैप घोषणा उस दायरे में कैसे व्यक्त की जाती है? यह होना चाहिए:

HashMap<String, ArrayList> dictMap 

यदि नहीं, तो यह ऑब्जेक्ट माना जाता है।

उदाहरण के लिए, यदि आपका कोड है:

HashMap dictMap = new HashMap<String, ArrayList>(); 
... 
ArrayList current = dictMap.get(dictCode); 

कि काम नहीं करेगा। इसके बजाय आप चाहते हैं:

HashMap<String, ArrayList> dictMap = new HashMap<String, Arraylist>(); 
... 
ArrayList current = dictMap.get(dictCode); 

रास्ता जेनरिक काम है कि प्रकार की जानकारी संकलक के लिए उपलब्ध है, लेकिन रनटाइम पर उपलब्ध नहीं है। इसे टाइप एरर कहा जाता है। हैश मैप (या कोई अन्य जेनेरिक कार्यान्वयन) का कार्यान्वयन ऑब्जेक्ट से निपट रहा है। संकलन समय के दौरान प्रकार की सुरक्षा जांच प्रकार के लिए प्रकार की जानकारी है। Generics documentation देखें।

यह भी ध्यान रखें कि ArrayList भी एक सामान्य वर्ग के रूप में लागू किया गया है, और इस प्रकार आप वहां एक प्रकार भी निर्दिष्ट करना चाहेंगे। मान लिया जाये कि अपने ArrayList अपनी कक्षा MyClass होता है, इसके बाद के संस्करण लाइन हो सकता है:

HashMap<String, ArrayList<MyClass>> dictMap 
2

मुझे लगता है अपने dictMap प्रकार HashMap की है, जो यह HashMap<Object, Object> के लिए डिफ़ॉल्ट बनाता है। यदि आप इसे अधिक विशिष्ट बनाना चाहते हैं, तो , या इससे भी बेहतर, HashMap<String, ArrayList<T>>

+0

धन्यवाद ... ArrayList > बिट क्या करता है? – cksubs

+0

यह ऐरेलिस्ट में ऑब्जेक्ट्स के प्रकार की घोषणा करता है, जैसे हैश मैप में पैरामीटर स्ट्रिंग कुंजी प्रकार और सूची मूल्य प्रकार घोषित करते हैं। आपको सूची में वस्तुओं के प्रकार के साथ टी को प्रतिस्थापित करना चाहिए – Jorn

2

जेनिक्स का उपयोग करना (उपर्युक्त उत्तरों में) यहां आपकी सबसे अच्छी शर्त है। मैं तो बस डबल जांच की है और:

test.put("test", arraylistone); 
    ArrayList current = new ArrayList(); 
    current = (ArrayList) test.get("test"); 

, साथ ही काम करेंगे के माध्यम से मैं यह सिफारिश नहीं होगा, क्योंकि जेनरिक सुनिश्चित करना है कि केवल सही डेटा जोड़ा जाता है, बल्कि पुनर्प्राप्ति समय हैंडलिंग करने के लिए कोशिश कर रहा से।

2

HashMap की get विधि एक Object लौट रहा है, लेकिन चर current एक ArrayList लगने की उम्मीद है: एक ArrayList को

ArrayList current = new ArrayList(); 
// ... 
current = dictMap.get(dictCode); 

ऊपर कोड काम करने के लिए, Object डाली किया जाना चाहिए:

ArrayList current = new ArrayList(); 
// ... 
current = (ArrayList)dictMap.get(dictCode); 

हालांकि, शायद पहले स्थान पर जेनेरिक संग्रह ऑब्जेक्ट्स का उपयोग करना बेहतर तरीका होगा:

HashMap<String, ArrayList<Object>> dictMap = 
    new HashMap<String, ArrayList<Object>>(); 

// Populate the HashMap. 

ArrayList<Object> current = new ArrayList<Object>();  
if(dictMap.containsKey(dictCode)) { 
    current = dictMap.get(dictCode); 
} 

ऊपर कोड संभालने जाता है कि ArrayListObject रों की एक सूची है, और कहा कि आवश्यक के रूप में बदला जाना चाहिए।

जेनिक्स पर अधिक जानकारी के लिए, जावा ट्यूटोरियल में lesson on generics है।

10
public static void main(String arg[]) 
{ 
    HashMap<String, ArrayList<String>> hashmap = 
     new HashMap<String, ArrayList<String>>(); 
    ArrayList<String> arraylist = new ArrayList<String>(); 
    arraylist.add("Hello"); 
    arraylist.add("World."); 
    hashmap.put("my key", arraylist); 
    arraylist = hashmap.get("not inserted"); 
    System.out.println(arraylist); 
    arraylist = hashmap.get("my key"); 
    System.out.println(arraylist); 
} 

null 
[Hello, World.] 

ठीक काम करता है ... शायद आपको मेरे कोड में आपकी गलती मिलती है।

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