2009-07-07 21 views
90

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

+4

आप कुंजी चाहते हैं, मूल्यों, या दोनों किया था? – harto

उत्तर

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

संपादित

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

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

:

+6

दरअसल, यह कोड कोई गारंटी नहीं देता है कि हैश मैप.कीसेट()। ToArray() [0] मूल मानचित्र से हैशैप.वल्यूज()। ToArray() [0] के लिए मूल कुंजी होगी। तो यह बेहद * खतरनाक है * – CrackerJack9

+1

@ क्रैकर जैक 9 क्या आप समझा सकते हैं? –

+11

कुंजी दो सरणी में उनके मूल्यों के अनुरूप नहीं होगी। –

61

आप कुंजी और मूल्यों चाहते हैं, आप हमेशा इस entrySet के माध्यम से कर सकते हैं तरीकों

+2

2017 में काम नहीं कर रहा है .. .. – OhadR

+0

@ ओहडआर यह वास्तव में – Midnightas

+0

काम करता है? मैं जावा 8 पर काम करता हूं? – OhadR

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

Object[][] twoDarray = new String[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]; 
} 

for (int i = 0; i < twoDarray.length; i++) { 
    for (int j = 0; j < twoDarray[i].length; j++) { 
     System.out.println(twoDarray[i][j]); 
    } 
} 
42

यदि आपके पास HashMap<String, SomeObject> hashMap तो

hashMap.values().toArray();

एक ऑब्जेक्ट [] वापस कर देगा। आप प्रकार SomeObject की एक सरणी चाहते हैं बजाय, आप इस्तेमाल कर सकते हैं:

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

+3

मुझे लगता है कि आप 'SomeObject'' की सरणी के लिए 'keySet()' के बजाय 'मान()' का अर्थ है। –

+3

आप 0 का उपयोग करने के बजाय सरणी आकार अपफ्रंट निर्दिष्ट करके प्रदर्शन में भी सुधार कर सकते हैं। उदाहरण यहां देखें: http://stackoverflow.com/a/5061692/265877 – Alex

26

कुंजियां और मान से प्रत्येक सरणी के लिए सही क्रम की गारंटी करने के लिए, का उपयोग इस (अन्य उत्तर का उपयोग अलग-अलग 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++; 
} 
+0

सही! हम दोनों कुंजी और मूल्य प्राप्त करते हैं, ऑटो प्रकार ग्रहण में भरते हैं, लंबे समय से इसकी तलाश करते हैं, thx! –

11

crackerjacks सुझाव के लिए एक वैकल्पिक, अगर आप व्यवस्था बनाए रखने के HashMap चाहते हैं। इसके स्थान पर कोई LinkedHashMap उपयोग करने पर विचार कर सकता है जहां तक ​​im बारे में पता के रूप में यह सुविधा है एक HashMap के समान है, लेकिन यह फीफो है इसलिए यह उस क्रम को बनाए रखता है जिसमें आइटम जोड़े गए थे।

+1

बहुत अच्छी बात, उस अंतर्दृष्टि के लिए धन्यवाद, मेरी मदद की! :) – mgibson

+0

फीफो टिप –

+0

+1 के लिए धन्यवाद LinkedHashMap – CrackerJack9

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

प्रश्न 'हैश मैप() 'के बारे में है, लेकिन आपका समाधान' हैशटेबल() 'के बारे में है ... कुछ [अंतर] हैं (http://stackoverflow.com/a/40878/3595288) उनके बीच – Choletski

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++; 
} 
6

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

hashMap.values().toArray(new MyObject[0]); 
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; 
    } 
संबंधित मुद्दे