2010-09-20 13 views
5

क्या मेरे पास मेरी आईडी और जानकारी, नाम, मात्रा मेरे मूल्य के रूप में कहने के साथ हैश मैप है?क्या 4 ऑब्जेक्ट्स के साथ हैशपैप होना संभव है?

ठीक है, कहें कि मेरे पास पहले से एक वर्ग (उत्पाद) है जो मेरे चर, गेटर्स और सेटर्स सेट करता है। मेरे चालान वर्ग में, जहां हैश मैप होगा। मैं की तरह डाल दिया जाएगा:

private HashMap<String, Products> keys = new HashMap<String, Products> 

मैं हालांकि कैसे HashMap तक पहुँचने के लिए काफी यकीन नहीं है। मैं एक वर्ग मुझे HashMap से जोड़ सकते हैं और चालान को दूर करने के लिए अनुमति देता है कि लागू कहते हैं, मैं नहीं जानता कि मूल्यों होगा क्या:

keys.put(??value of id??,??not sure what goes here??); 
+0

आप कर सकते हैं, लेकिन आप एक वस्तु बनाने और अपने नक्शे में जोड़ने का एक उदाहरण के लिए 2 नेस्टेड HashMaps – Luxspes

+0

देखें जाविद Jamae के जवाब की जरूरत है। – ColinD

+0

क्या ऐसा कुछ ऐसा लगेगा? मुझे प्राप्त विधियों पर एक त्रुटि मिल रही है: जानकारी जानकारी = नया नया (getID(), getName(), getInfo(), getQuantity()); – Jack

उत्तर

19

ज़रूर। अपनी जानकारी, नाम और मात्रा वाली एक और कक्षा बनाएं और इसे अपने हैश मैप के मान के रूप में रखें।

+3

और यदि आपको बाद में आवश्यकता हो तो आप आईडी को भी रखना चाहेंगे? :) – Joset

+0

हैश मैप <इंटीजर, हैश मैप <स्ट्रिंग, ऑब्जेक्ट >> के साथ समान प्रभाव प्राप्त किया जा सकता है, और आपको एक नई कक्षा – Luxspes

+5

@Luxspes बनाने की ज़रूरत नहीं है: क्या आप प्रत्येक वर्ग के लिए शुल्क लेते हैं? –

1

कैसे HashMap<Integer, ArrayList<String>>?

अपडेट: कृपया इसे टालने का प्रयास करें, this एक बेहतर तरीका है।

+0

मुझे लगता है कि आपको इसे पीछे की ओर मिला है, ऐरेलिस्ट <हैश मैप <स्ट्रिंग, ऑब्जेक्ट >> लिखना होगा, लेकिन हैश मैप <इंटीजर, ऐरेलिस्ट > (क्योंकि यह जानने का कोई तरीका नहीं होगा कि सरणी सूची में कौन से तत्व हैं आपकी "जानकारी", "नाम" या "मात्रा" – Luxspes

+0

यदि आपके पास 1 आईडी के 4 गुण हैं, तो आप इस तरह से क्यों नहीं बचा सकते? – zengr

+0

क्योंकि यह जानने का कोई तरीका नहीं होगा कि सरणी सूची में कौन से तत्व आपकी "जानकारी", "नाम" या "मात्रा" – Luxspes

-1

बेशक, आप उदाहरण के लिए इसे इस तरह घोषित कर सकते हैं: HashMap<Integer, HashMap<String,Object>> आप अपने आईडी को अपने आंतरिक हैश मैप से जोड़ने के लिए बाहरी हैशप का उपयोग करते हैं, और आंतरिक में, आप कुंजी "जानकारी", "नाम", "मात्रा बनाते हैं "और उनके साथ सहयोगी मूल्य। ArrayList<HashMap<String,Object>> कि जिस तरह से आप (आईडी के आधार पर) अपने "जानकारी" में से प्रत्येक के लिए उपयोग अनुक्रमित है, "नाम":

बेशक

, आप भी बाहरी संग्रह के रूप में एक ArrayList इस्तेमाल कर सकते हैं (यह अपने आईडी के लिए एक बेहतर मैच हो सकता है

public class Info { 
    private String info; 
    private String name; 
    private int quantity; 

    ... 

    public Info(String info, String name, int quantity) { 
    ... 
    } 
} 

तो नक्शे में कुछ डाल करने के लिए ऐसा करते हैं: "मात्रा" hashmap "रिकॉर्ड"

+0

जैसा कि मैंने कहीं और तर्क दिया है, यह आम तौर पर सबसे अच्छा विचार नहीं है। – ColinD

+0

आपकी आवश्यकताओं के लिए सबसे अच्छा विचार नहीं है? या सवाल पूछने वाले व्यक्ति की आवश्यकताओं से सबसे अच्छा विचार नहीं है? मुझे माफ़ कर दो, लेकिन मेरा मानना ​​है कि आप उद्देश्य नहीं कर रहे हैं। – Luxspes

6

नहीं, लेकिन सबसे अच्छा तरीका है के बारे में जानकारी आप एक कक्षा में मानचित्र में रखना चाहते हैं रैप करने के लिए है :

Info info = new Info("info", "name", 2); 
Map map = new HashMap<Integer, Info>(); 
map.put(22, info); 

और ऐसा करने के कुछ बाहर निकलने के लिए:

Info info = map.get(22) 
+0

हैश मैप <इंटीजर, हैश मैप <स्ट्रिंग, ऑब्जेक्ट >> के साथ समान प्रभाव प्राप्त किया जा सकता है, और आपको एक नई कक्षा – Luxspes

+3

@Luxspes बनाने की आवश्यकता नहीं है: नहीं। कक्षा के विपरीत, 'हैश मैप <स्ट्रिंग, ऑब्जेक्ट>' केवल बताता है आप "हे दोस्तों, कुछ वस्तुओं से जुड़े कुछ तार हो सकते हैं! या शायद नहीं!"। एक वर्ग आपको बता सकता है कि वास्तव में कौन से क्षेत्र हैं, और उनके प्रकार क्या हैं! एक नई कक्षा बनाना एक बड़ा सौदा नहीं है। – ColinD

+0

@ColinD: कोई बड़ा सौदा नहीं है, जब तक कि आप इसे डेटाबेस क्वेरी के नतीजे का प्रतिनिधित्व करने के लिए उपयोग नहीं कर रहे हैं जिसे उपयोगकर्ता द्वारा इंटरैक्टिव रूप से बनाया जा सकता है, फिर, मानचित्र की लचीलापन इसे एक आदर्श समाधान बनाती है (और बनाने का संयोजन का विस्फोट उपयोगकर्ता द्वारा चुने गए प्रत्येक संभावित संयोजन के लिए एक वर्ग, इसे अनुपयोगी बनाता है) – Luxspes

-1

आप कुंजी के रूप में आईडी है और हो सकता है एक List या Set (Collection सामान्य रूप में) मूल्य के रूप में वस्तुओं की।

0

बिल्कुल नहीं।

एक मानचित्र कुंजी और मूल्यों के बीच सख्ती से 1 से 1 संबंध परिभाषित करता है। मानचित्र में एक कुंजी का एक मूल्य है।

आप निम्न में से एक करने की ज़रूरत है कि आप एक कुंजी के साथ एक से अधिक मान संबद्ध करना चाहते हैं:

  • एक Values वर्ग एक वस्तु के रूप में मूल्यों का प्रतिनिधित्व करने के लिए परिभाषित करें; जैसे @ स्टार्की और @ जावेद के उत्तरों के अनुसार। फिर नक्शा Map<String, Values> बन जाता है (यह मानते हुए कि कुंजी प्रकार स्ट्रिंग है)।

  • एक Map<String,List<Object>> या Map<String,Object[]> के रूप में नक्शे परिभाषित करें और एक untyped सूची/सरणी

  • के रूप में मूल्यों का प्रतिनिधित्व एक Map<String,Properties> या Map<String,Map<String,Object>> के रूप में नक्शे परिभाषित करें और एक साहचर्य सरणी के जावा समकक्ष के रूप में मूल्यों का प्रतिनिधित्व।

इनमें से पहला विकल्प सबसे सुरक्षित (रनटाइम त्रुटियों का सबसे छोटा मौका), सबसे कुशल और सर्वोत्तम शैली दोनों है।

(एक तरफ: एक अपाचे कॉमन्स MultiMap एक और संभावना के रूप में माना जा सकता है, लेकिन वैचारिक मॉडल और एपीआई वास्तव में इस यूज-केस मेल नहीं खाते।)

0

ज़रूर। ,,

  • HashMap<IdType, List<String>>IdType स्ट्रिंग या पूर्णांक के साथ कुंजी आप उपयोग करना चाहते हैं पर निर्भर करता: कैसे लचीला अपने datastructe है के आधार पर आप एक ला एक hashmap उपयोग कर सकते हैं।
  • HashMap<IdType, String[]>
  • HashMap<IdType, YourObjectType>, YourObjectType के साथ एक वस्तु आप अपने आप को परिभाषित beeing, मूल्यों पकड़े आप कुछ भी आप एक वस्तु के रूप में परिभाषित कर सकते हैं होना निश्चित रूप से

YourObjectType कर सकते हैं पसंद है। यदि आप चाहें तो एक और हैश मैप भी।

0

मानचित्र का उपयोग करते समय चिंताओं में से एक हार्डकोडेड कुंजी का उपयोग करेगा। यदि कुंजी एक स्ट्रिंग है, और कुंजी बदलती है। एक हार्डकोडेड स्ट्रिंग के बजाय स्थिर का उपयोग करने पर विचार कर सकते हैं।

समर्पित कक्षा होने के बाद नाम परिवर्तनों की जांच करने के लिए कंपाइलर का लाभ होता है। हालांकि, जैसा कि पहले की टिप्पणियों में बताया गया है .. यह चिंता का विषय बन सकता है ...

मेरी राय में दोनों व्यवहार्य हैं। हमें

0

पर निर्भर करता है कि एक ऑब्जेक्ट बनाएं जो चारों को एक साथ जोड़ता है। की तरह कुछ:

public class Foo { 
    private String s1; 
    private String s2; 
    private int v3; 
    private MyObject obj1 
    // constructors, getters, helper functions. 
} 
संबंधित मुद्दे