2015-05-20 4 views
7

मेरे पास दो स्ट्रिंग सरणी हैं। एक छोटा नाम है।जावा में एक हैश मैप को दो arrays कैसे मैप करें?

// days short name 
String[] shortNames = {"SUN", "MON", "...", "SAT"}; 

अन्य होने लंबा नाम।

// days long name 
String[] longNames = {"SUNDAY", "MONDAY", "....", "SATURDAY"}; 

दोनों में समान संख्या में तत्व हैं। मैं हैश मैप में VALUE के रूप में छोटा नाम और लंबा नाम कैसे मैप कर सकता हूं?

HashMap<String, String> days = new HashMap<>(); 

मुझे पता है, मैं लूपिंग कर सकता हूं। क्या कोई बेहतर तरीका है?

+0

मैं पाशन सबसे अच्छा तरीका है इस संदर्भ में है लगता है:

यहाँ एक उदाहरण है। – Razib

+0

क्यों पहली जगह सरणी में स्टोर करें? –

उत्तर

14

आप इसे करने के कई तरीके हैं। एक काफी समझते हैं और लागू जावा 8 धाराओं और कलेक्टरों उपयोग कर रहा है महत्वपूर्ण मूल्य जोड़े के लिए सूचकांक की एक धारा से मैप करने के लिए करने के लिए आसान है:

Map<String, String> days = IntStream.range(0, shortNames.length).boxed() 
    .collect(Collectors.toMap(i -> shortNames[i], i -> longNames[i])); 

वहाँ किसी तीसरे पक्ष जावा पुस्तकालयों के लिए एक 'जिप' समारोह में शामिल कर रहे हैं दो धाराएं लें और एक से दूसरे में नक्शा बनाएं। लेकिन वास्तव में वे ऊपर दिए गए कोड के समान चीज़ प्राप्त करने के लिए केवल तटस्थ तरीके हैं।

+0

और जावा 7 और उससे नीचे के बारे में क्या? –

+0

@ 10sw33 जावा 8 के नीचे (उन्नयन के अलावा!) आपके पास अभी भी कुछ विकल्प हैं। किसी तृतीय सरणी लाइब्रेरी का उपयोग करें या एक सरणी में सभी आइटमों के माध्यम से जाने के लिए 'Arrays.toList (shortNames) .forEach' का उपयोग करें और मानचित्र प्रविष्टियां जोड़ें। मुझे पता है कि यह वास्तव में सिर्फ एक और नाम से पुनरावृत्ति है लेकिन फिर भी धाराएं हैं! – sprinter

+0

@sprinter अच्छा जवाब है, लेकिन उसे बॉक्सिंग() की आवश्यकता है क्योंकि जेन्स ने नीचे कहा था। –

1

accepted answer मेरे लिए काम नहीं किया, क्योंकि IntStream एक-तर्क collect विधि प्रदान नहीं करता है।

फिर भी toMap कलेक्टर से लाभ प्राप्त करने के लिए आपको int प्राइमेटिव्स को पहले Integer ऑब्जेक्ट्स में बॉक्स करना होगा। आप तत्व क्रम बनाए रखने के लिए करना चाहते हैं, तो LinkedHashMap::new के साथ एक साथ toMap की विस्तारित संस्करण का उपयोग नीचे दिखाया गया है जैसे:

package learning.java8; 

import static java.util.stream.Collectors.*; 
import static org.junit.Assert.*; 

import java.time.DayOfWeek; 
import java.time.format.TextStyle; 
import java.util.Arrays; 
import java.util.LinkedHashMap; 
import java.util.Locale; 
import java.util.Map; 
import java.util.stream.IntStream; 

import org.junit.Test; 

public class IntStreamLT { 

    @Test 
    public void q30339679() { 

     final String[] shortNames = getDayOfWeekNamesInEnglish(TextStyle.SHORT); 
     final String[] longNames = getDayOfWeekNamesInEnglish(TextStyle.FULL); 

     final Map<String, String> days = IntStream.range(0, shortNames.length).boxed() 
       .collect(toMap(i -> shortNames[i], i -> longNames[i])); 

     System.out.println(days); 

     final Map<String, String> sorted = IntStream.range(0, shortNames.length).boxed() 
       .collect(toMap(
         i -> shortNames[i], i -> longNames[i], 
         (i, j) -> i, LinkedHashMap::new)); 

     System.out.println(sorted); 

     assertEquals("{Mon=Monday, Tue=Tuesday, Wed=Wednesday, Thu=Thursday, " 
       + "Fri=Friday, Sat=Saturday, Sun=Sunday}", sorted.toString()); 
    } 

    private static String[] getDayOfWeekNamesInEnglish(final TextStyle style) { 

     return Arrays.stream(DayOfWeek.values()) 
       .map(day -> day.getDisplayName(style, Locale.ENGLISH)) 
       .toArray(String[]::new); 
    } 
} 

यह भी देखें: Why don't primitive Stream have collect(Collector)?

1

आप org.apache.commons.lang3.ArrayUtils उपयोग कर सकते हैं। - जब इन दो सरणियों के आकार के समान हैं

Map colorMap = ArrayUtils.toMap(new String[][] { 
    {"RED", "#FF0000"}, 
    {"GREEN", "#00FF00"}, 
    {"BLUE", "#0000FF"}}); 
संबंधित मुद्दे