2010-12-09 18 views
6

मैं एक मैपिंग बनाना चाहता हूं जो String कुंजी और आदिम मान के रूप में लेता है। मैं जावा दस्तावेज़ों को देख रहा था और यह नहीं देखा कि Primitive एक वर्ग प्रकार था, या उन्होंने किसी प्रकार की रैपिंग कक्षा साझा की।जावा मैपिंग्स और प्राइमेटिव्स

मैं मूल्य को आदिम कैसे बना सकता हूं?

Map<String, Primitive> map = new HashMap<String, Primitive>();

+0

यह अस्पष्ट होने के लिए मेरी गलती थी। मैं क्या कहता हूं कि मैं एक आदिम प्रकार होने के लिए मूल्य को बाधित करना चाहता हूं, मेरा मतलब है कि मैं चाहता हूं कि किसी भी प्राचीन प्रकार को उस विशिष्ट मानचित्र में किसी मान के रूप में उपयोग करने की अनुमति दें। – Prospero

उत्तर

7

Java AutoboxingLong, Integer, Double पर मानचित्र बनाने की अनुमति देता है और फिर उन्हें आदिम मूल्यों का उपयोग करके संचालित करता है। उदाहरण के लिए:

java.util.HashMap<String, Integer> map = new java.util.HashMap<String, Integer>(); 
map.put("one", 1); // 1 is an integer, not an instance of Integer 

आप एक नक्शा अलग आदिम प्रकार में संग्रहीत करना चाहते हैं, तो आप इसे एक Map<String, Number> बनाकर कर सकते हैं। के मूल्यों को संग्रहीत करने देता BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short (और AtomicLong, AtomicInteger)।

यहाँ एक उदाहरण है:

"जावा आदिम नक्शे"
Map<String, Number> map = new HashMap<String, Number>(); 

map.put("one", 1); 
map.put("two", 2.0); 
map.put("three", 1L); 

for(String k:map.keySet()) { 
    Number v = map.get(k); 
    System.err.println(v + " is instance of " + v.getClass().getName() + ": " + v); 
} 
+0

लपेटने की आवश्यकता नहीं है क्या जेनिक्स के साथ एक या खंड निर्दिष्ट करने का कोई तरीका है? उदाहरण के लिए कहें <स्ट्रिंग, नाव | कार> – Prospero

+0

@ डूडल आपको बेस क्लास 'वाहन' बनाना चाहिए और उसे 'नाव, कार' में विस्तारित करना चाहिए और फिर '<स्ट्रिंग, वाहन>' बनाना चाहिए। – khachik

+1

हां, एक सुपरटेप वाहन निकालें और इसे एक नक्शा <स्ट्रिंग, वाहन> या मानचित्र <स्ट्रिंग, बनाएं? वाहन बढ़ाता है> (जेनेरिक वाक्यविन्यास हमेशा मुझे भ्रमित करता है) – ivy

2

आप निम्न कर सकते हैं:

Map<String, Integer> map = new HashMap<String, Integer>() 

फिर संचालन की तरह:

map.put("One", 1); 

काम करेंगे। आदिम 1 को Integer में ऑटो-बॉक्स किया जाएगा। इसी तरह:

int i = map.get("One"); 

इसलिए भी कि Integer एक int में ऑटो अनबॉक्स्ड मिल जाएगा काम करेंगे।

autoboxing and autounboxing पर कुछ दस्तावेज़ देखें।

+1

'मानचित्र' एक इंटरफ़ेस है। – khachik

+0

मानचित्र aninterface है .. –

+0

@khacik, तय। यह बात बताने के लिए धन्यवाद। – jjnguy

2

प्रत्येक आदिम में java.lang.Longlong के लिए एक रैपर वर्ग है।

तो तुम String के आवरण वर्ग मैप कर सकते हैं और यदि आप जावा 1.5+ उपयोग करते हैं, बस मानचित्र को पुरातन डाल:

Map<String, Integer> map = new HashMap<String, Integer>(); 
map.put("key", 10); 
int value = map.get("key"); // value is 10. 
1

आप अपने बॉक्स्ड समकक्ष का प्रयोग करेंगे।

Map<String,Integer> map = new HashMap<String,Integer>(); 

इंटीजर आदिम int का एक अपरिवर्तनीय बॉक्स प्रकार है। समान लघु, लंबे, डबल, फ्लोट और बाइट बॉक्स वाले प्रकार हैं।

0

आप Map इंटरफ़ेस में कुंजी या मान के रूप में आदिम नहीं हो सकते हैं। इसके बजाय आप Integer, Character, Boolean और अन्य जैसे रैपर वर्गों का उपयोग कर सकते हैं।

wiki पर और पढ़ें।

+0

ऑटोबॉक्सिंग का ख्याल रखना चाहिए यदि जावा 1.5 आगे का उपयोग किया जाता है तो आपको प्राइमेटिव मैन्युअल रूप से – dimitrisli

4

गूगल और आप कुछ विशेष प्रकार के जो autoboxing के लिए जरूरत से बचने के मिल जाएगा।इसका एक उदाहरण है: https://labs.carrotsearch.com/hppc.html

हालांकि, सामान्य रूप से आपको अन्य उत्तरों में उल्लिखित ऑटोबॉक्सिंग के साथ ठीक करना चाहिए।

+0

मुझे दिखाने के लिए एक टक्कर लगी है तेज़ उपयोग कुछ ऐसा है जो मेरे लिए उपयोगी हो सकता है धन्यवाद। – Prospero

+0

लिंक मर चुका है। – ppasler

+0

मैंने मृत लिंक को एक कार्य करने के लिए अद्यतित कर दिया है – mchr

1

यदि आपको प्रदर्शन कारणों के लिए एक आदिम होने की आवश्यकता है, तो आप TObjectIntHashMap या इसी तरह का उपयोग कर सकते हैं।

उदा। मानचित्र < स्ट्रिंग, पूर्णांक> साथ

TObjectIntHashMap<String> map = new TObjectIntHashMap(); 

map.put("key", 10); 
int value = map.get("key"); 

एक अंतर यह है कि मूल्यों प्रकार int आदिम बजाय पूर्णांक वस्तु का हो रहा है।