जावा: HashMap <स्ट्रिंग, ऑब्जेक्ट> को सरणी में कैसे परिवर्तित किया जाए


116

मुझे HashMap<String, Object>एक सरणी में बदलने की आवश्यकता है; क्या कोई मुझे दिखा सकता है कि यह कैसे किया गया है?


4
आप चाबियाँ, मूल्य या दोनों चाहते हैं?
harto

जवाबों:


191
hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values

संपादित करें

यह ध्यान दिया जाना चाहिए कि दोनों सरणियों का क्रम समान नहीं हो सकता है, जब जोड़ी कुंजी / मानों की आवश्यकता होती है, तो पुनरावृत्ति के लिए बेहतर दृष्टिकोण के लिए oxbow_lakes उत्तर देखें।


9
वास्तव में, यह कोड कोई गारंटी नहीं देता है कि hashMap.keySet () .Array () [0] मूल मानचित्र से hashMap.values ​​() (.Array) ([0] के लिए मूल कुंजी होगी। तो यह बेहद खतरनाक है
CrackerJack9

2
@ CrackerJack9 आप समझा सकते हैं?
जेक विल्सन

12
चाबियाँ दो सरणियों में अपने मूल्यों के अनुरूप नहीं होंगी।
लैंडन कुहन

5
@Jakobud landon9720 सही है ... ऑर्डर पीडो-रैंडम है, और यह गारंटी नहीं दी जा सकती कि कुंजी [0] मूल्य के अनुरूप होगी [0] जब आप कुंजी को a Setऔर मानों में बदल देते हैं Collection। यद्यपि वे तकनीकी रूप से सरणियों में परिवर्तित हो जाते हैं (और आपके प्रश्न का उत्तर देते हैं), कुंजी-मूल्य जोड़ी की अवधारणा खो गई है - यही कारण है कि यह एक बहुत ही भ्रामक (और खतरनाक) उत्तर है ...
CrackerJack9

मैं इस कोड स्निपेट के खतरे को देख सकता हूं। जब मैंने इसे लिखा, तो मेरा टर्मिनल बाहर पहुंच गया और मुझे थप्पड़ मार दिया। बहुत खतरनाक! सावधान रहें!
artburkart

65

यदि आप कुंजियाँ और मान चाहते हैं, तो आप हमेशा इस के माध्यम से कर सकते हैं entrySet:

hashMap.entrySet().toArray(); // returns a Map.Entry<K,V>[]

प्रत्येक प्रविष्टि से आप (और निश्चित रूप से) और विधियों के माध्यम से कुंजी और मूल्य दोनों प्राप्त कर सकते हैंgetKeygetValue


@ CrackerJack9 नहीं, यह काम करता है। स्वीकृत समाधान के विपरीत, यह कुंजी-मूल्य जोड़े को बनाए रखता है। आप के {key, value}[]रूप में विरोध कियाkey[], value[]
Tobiq

51

यदि आपके पास है HashMap<String, SomeObject> hashMap:

hashMap.values().toArray();

वापस आ जाएगी Object[]। यदि इसके बजाय आप प्रकार की एक सरणी चाहते हैं SomeObject, तो आप उपयोग कर सकते हैं:

hashMap.values().toArray(new SomeObject[0]);

3
मुझे लगता है कि आप के values()बजाय keySet()एक सरणी के लिए मतलब है SomeObject
पॉल बेलोरा

4
आप 0. का उपयोग करने के बजाय ऐरे आकार को निर्दिष्ट करके प्रदर्शन में सुधार कर सकते हैं। यहां देखें उदाहरण: stackoverflow.com/a/5061692/265877
एलेक्स '

@ एलेक्स "पूर्व-आकार के सरणी का उपयोग करने वाले पुराने जावा संस्करणों में अनुशंसित था (...) हालांकि OpenJDK 6 के देर से अपडेट के बाद यह कॉल आंतरिक था, जिससे पूर्व की तुलना में खाली सरणी संस्करण का प्रदर्शन और कभी-कभी और भी बेहतर हो गया। -साइज़ किया गया संस्करण। इसके अलावा प्री-साइज़ ऐरे को पास करना समवर्ती या सिंक्रोनाइज़ किए गए कलेक्शन के लिए खतरनाक है क्योंकि डेटा रेस आकार और ऑरेरे कॉल के बीच संभव है, जिसके परिणामस्वरूप एरे के अंत में अतिरिक्त नल हो सकते हैं, अगर संग्रह के दौरान समवर्ती सिकुड़ गया हो। आपरेशन।" - intellij
हैम्बर्ग

30

कुंजी और मूल्यों के प्रत्येक सरणी के लिए सही क्रम की गारंटी देने के लिए, इसका उपयोग करें (अन्य उत्तर व्यक्तिगत Setएस का उपयोग करते हैं जो ऑर्डर करने के लिए कोई गारंटी नहीं देते हैं।

Map<String, Object> map = new HashMap<String, Object>();
String[] keys = new String[map.size()];
Object[] values = new Object[map.size()];
int index = 0;
for (Map.Entry<String, Object> mapEntry : map.entrySet()) {
    keys[index] = mapEntry.getKey();
    values[index] = mapEntry.getValue();
    index++;
}

उत्तम! हमें ग्रहण में भरने वाले ऑटो प्रकार के साथ, कुंजी और मूल्य दोनों मिलते हैं, लंबे समय से यह देख रहे हैं, thx!
कुंभ

12

CrackerJacks सुझाव का एक विकल्प, यदि आप चाहते हैं कि HashMap आदेश बनाए रखें तो आप LinkedHashMap का उपयोग करने पर विचार कर सकते हैं। जहाँ तक im के बारे में पता है कि यह कार्यक्षमता एक HashMap के समान है, लेकिन यह FIFO है इसलिए यह उस क्रम को बनाए रखता है जिसमें आइटम जोड़े गए थे।


7

मैंने @kmccoy के रूप में लगभग एक ही इस्तेमाल किया, लेकिन इसके बजाय keySet()मैंने ऐसा किया

hashMap.values().toArray(new MyObject[0]);

6
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");

Object[][] twoDarray = new Object[map.size()][2];

Object[] keys = map.keySet().toArray();
Object[] values = map.values().toArray();

for (int row = 0; row < twoDarray.length; row++) {
    twoDarray[row][0] = keys[row];
    twoDarray[row][1] = values[row];
}

// Print out the new 2D array
for (int i = 0; i < twoDarray.length; i++) {
    for (int j = 0; j < twoDarray[i].length; j++) {
        System.out.println(twoDarray[i][j]);
    }
}

3

एक आयाम में पाने के लिए।

    String[] arr1 = new String[hashmap.size()];
    String[] arr2 = new String[hashmap.size()];
    Set entries = hashmap.entrySet();
    Iterator entriesIterator = entries.iterator();

    int i = 0;
    while(entriesIterator.hasNext()){

        Map.Entry mapping = (Map.Entry) entriesIterator.next();

        arr1[i] = mapping.getKey().toString();
        arr2[i] = mapping.getValue().toString();

        i++;
    }


दो आयामों में प्राप्त करने के लिए।

   String[][] arr = new String[hashmap.size()][2];
   Set entries = hashmap.entrySet();
   Iterator entriesIterator = entries.iterator();

   int i = 0;
   while(entriesIterator.hasNext()){

    Map.Entry mapping = (Map.Entry) entriesIterator.next();

    arr[i][0] = mapping.getKey().toString();
    arr[i][1] = mapping.getValue().toString();

    i++;
}

2

यदि आप जावा 8+ का उपयोग कर रहे हैं और Arrayशायद 2N की जरूरत है , तो शायद TestNG डेटा प्रदाताओं के लिए, आप कोशिश कर सकते हैं:

map.entrySet()
    .stream()
    .map(e -> new Object[]{e.getKey(), e.getValue()})
    .toArray(Object[][]::new);

यदि आपके Objects s हैं Stringऔर आपको एक की आवश्यकता है String[][], तो प्रयास करें:

map.entrySet()
    .stream()
    .map(e -> new String[]{e.getKey(), e.getValue().toString()})
    .toArray(String[][]::new);

0

आप यह भी कोशिश कर सकते हैं।

public static String[][] getArrayFromHash(Hashtable<String,String> data){
        String[][] str = null;
        {
            Object[] keys = data.keySet().toArray();
            Object[] values = data.values().toArray();
            str = new String[keys.length][values.length];
            for(int i=0;i<keys.length;i++) {
                str[0][i] = (String)keys[i];
                str[1][i] = (String)values[i];
            }
        }
        return str;
    }

यहां मैं स्ट्रिंग का उपयोग रिटर्न प्रकार के रूप में कर रहा हूं। आप इसे अपने द्वारा आवश्यक रिटर्न प्रकार में बदल सकते हैं।


1
सवाल है, HashMap()लेकिन आपके समाधान के बारे में है Hashtable()... उनके बीच कुछ मतभेद हैं
Choletski

0
@SuppressWarnings("unchecked")
    public static <E,T> E[] hashMapKeysToArray(HashMap<E,T> map)
    {
        int s;
        if(map == null || (s = map.size())<1)
            return null;

        E[] temp;
        E typeHelper;
        try
        {
            Iterator<Entry<E, T>> iterator = map.entrySet().iterator();
            Entry<E, T> iK = iterator.next();
            typeHelper = iK.getKey();

            Object o = Array.newInstance(typeHelper.getClass(), s);
            temp = (E[]) o;

            int index = 0;
            for (Map.Entry<E,T> mapEntry : map.entrySet())
            {
                temp[index++] = mapEntry.getKey();
            }
        }
        catch (Exception e)
        {
            return null;
        }
        return temp;
    }
//--------------------------------------------------------
    @SuppressWarnings("unchecked")
    public static <E,T> T[] hashMapValuesToArray(HashMap<E,T> map)
    {
        int s;
        if(map == null || (s = map.size())<1)
            return null;

        T[] temp;
        T typeHelper;
        try
        {
            Iterator<Entry<E, T>> iterator = map.entrySet().iterator();
            Entry<E, T> iK = iterator.next();
            typeHelper = iK.getValue();

            Object o = Array.newInstance(typeHelper.getClass(), s);
            temp = (T[]) o;

            int index = 0;
            for (Map.Entry<E,T> mapEntry : map.entrySet())
            {
                temp[index++] = mapEntry.getValue();
            }
        }
        catch (Exception e)
        {return null;}

        return temp;
    }

0
HashMap<String, String> hashMap = new HashMap<>();
String[] stringValues= new String[hashMap.values().size()];
hashMap.values().toArray(stringValues);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.