2009-11-09 14 views
5

में परिवर्तित करना स्ट्रिंग्स के 2 डी सरणी को हैश मैप में परिवर्तित करने का सबसे आसान तरीका क्या है?स्थिर 2 डी स्ट्रिंग सरणी को हैश मैप

उदाहरण के लिए, ये लो:

 
final String[][] sheetMap = { /* XSD Name, XSL Sheet Name */ 
           {"FileHeader", "FileHeader"}, 
           {"AccountRecord", "AccountRecord"}, 
           {"DriverCardRecord", "DriverCardRecord"}, 
           {"AssetCardRecord", "AssetCardRecord"}, 
           {"SiteCardRecord", "SiteCardRecord"} 
          }; 

यह सबसे अधिक संभावना एक फ़ाइल से लोड किया जा रहा है और बहुत बड़ा हो जाएगा।

Map<String, String > sheetMap = new HashMap<String, String >() {{ 
    put("FileHeader", "FileHeader"); 
    put("AccountRecord", "AccountRecord"); 
    put("DriverCardRecord", "DriverCardRecord"); 
    put("AssetCardRecord", "AssetCardRecord"); 
    put("SiteCardRecord", "SiteCardRecord"); 
}}; 
+0

मैं शायद सिर्फ तत्व है, जो मैं अब कर रहा हूँ के माध्यम से पाशन से है कि अन्य जोड़ना चाहिए, वहाँ एक संग्रह विधि मैं बस करने के लिए उपयोग कर सकते हैं इस 2 डी सरणी को हैश मैप उदाहरण में पास करें? – Casey

+1

ऐसा नहीं है कि मुझे पता है - और मुझे नहीं लगता कि यह * संभव * सभी सरणी तत्वों पर एक साधारण लूप की तुलना में कुछ अधिक कुशल लागू करने के लिए है। तो आप कुछ शराब से ऊपर कुछ हासिल नहीं करेंगे, जिसे आप इसे अपने 'उपयोग' प्रकार के वर्ग में डालकर डुप्लिकेट कर सकते हैं। –

उत्तर

20
final Map<String, String> map = new HashMap<String, String>(sheetMap.length); 
for (String[] mapping : sheetMap) 
{ 
    map.put(mapping[0], mapping[1]); 
} 
+0

+1 या मुझे केवल सेकंड तक इसे हराया :-) –

+1

+1: कभी-कभी सबसे सरल समाधान = = सबसे अच्छा समाधान है। – DivineWolfwood

4

तुम सिर्फ एक सुविधाजनक तरीके से अपने नक्शे को प्रारंभ करना चाहते हैं, तो आप उपयोग कर सकते हैं double brace initialization अगर यह एक फ़ाइल से लोड किया जा रहा है, इंटरमीडिएट सरणी चरण के माध्यम से जाओ! सरणी बनाने से पहले आपको इसे पहले लोड करना होगा या आप सरणी के आकार को नहीं जान पाएंगे। बस एक हैश मैप बनाएं और प्रत्येक प्रविष्टि को इसे पढ़ने के रूप में जोड़ें।

+0

इसमें कुछ नकारात्मक परिणाम हो सकते हैं और व्यापक रूप से एक विरोधी पैटर्न माना जाता है - https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/ –

2

प्रतीक्षा;:

+0

हाँ, यह योजना है। हालांकि, मुझे नहीं पता कि इस समय जानकारी कहां संग्रहीत की जा रही है, इसलिए मैंने इसे सरणी में कड़ी मेहनत की।इस सवाल को पूरा करने के लिए यह मामला सामने आया है कि कलेक्शन फ्रेमवर्क में पहले से ही इस कार्य को पूरा करने के लिए उपयोगिता विधि शामिल है, भले ही इसे कार्यान्वित करने के लिए तुच्छ हो। जहां भी संभव हो मैं संग्रह में एक विधि का उपयोग करना चाहूंगा। – Casey

+0

आह। अच्छा, हाँ, यह नहीं करता है। अगर ऐसा होता है, तो यह किसी चीज का संग्रह स्वीकार करेगा, न कि सरणी। शायद नक्शा। एंटर्री का। लेकिन यह वास्तव में बहुत उपयोगी नहीं है। लूपिंग बेहतर है। –

0

मौजूदा जवाब अच्छी तरह से काम, ज़ाहिर है, लेकिन लगातार नए जानकारी के साथ इस साइट को अद्यतन करने के हित में है, यहाँ जावा 8 में यह करने के लिए एक तरीका है:

String[][] arr = {{"key", "val"}, {"key2", "val2"}}; 
HashMap<String, String> map = Arrays.stream(arr) 
     .collect(HashMap<String, String>::new, 
       (mp, ar) -> mp.put(ar[0], ar[1]), 
       HashMap<String, String>::putAll); 

जावा 8 Stream रों कमाल के हैं, और मैं और अधिक विस्तृत जानकारी के लिए उन्हें देखने के लिए प्रोत्साहित करते हैं, लेकिन यहां इस विशेष ऑपरेशन के लिए मूल बातें:

  • Arrays.stream एक Stream<String[]> के साथ काम करने के लिए मिल जाएगा।
  • collect अपना Stream लेता है और इसे सभी वस्तुओं को एकत्रित करने वाली एक वस्तु पर कम कर देता है। इसमें तीन कार्य होते हैं। पहला कार्य, आपूर्तिकर्ता, किसी ऑब्जेक्ट का एक नया उदाहरण उत्पन्न करता है जो सदस्यों को एकत्र करता है, इसलिए हमारे मामले में, HashMap बनाने के लिए मानक विधि। दूसरा फ़ंक्शन, संचयक, निर्धारित करता है कि Stream के सदस्य को लक्ष्य ऑब्जेक्ट में कैसे शामिल किया जाए, आपके मामले में हम केवल put कुंजी और मान को प्रत्येक सरणी से पहले और दूसरे मान के रूप में परिभाषित करना चाहते हैं, मानचित्र में। तीसरा कार्य, combiner, एक है जो किसी भी कारण से, दो लक्षित वस्तुओं को जोड़ सकता है, JVM ने कई HashMap एस (इस मामले में, या किसी अन्य मामले में जो भी अन्य लक्ष्य वस्तु के साथ संचय चरण निष्पादित करने का निर्णय लिया) और फिर उन्हें एक में जोड़ना होगा, जो मुख्य रूप से असीमित निष्पादन के लिए है, हालांकि यह आमतौर पर नहीं होगा।
1

tradeJmark जवाब देने के लिए एक से थोड़ा क्लीनर विकल्प के रूप में:

String[][] arr = // your two dimensional array 
Map<String, String> arrMap = Arrays.stream(arr).collect(Collectors.toMap(e -> e[0], e -> e[1])); 

// Sanity check! 
for (Entry<String, String> e : arrMap.entrySet()) { 
    System.out.println(e.getKey() + " : " + e.getValue()); 
}