জাভা: কিভাবে হাশম্যাপ <স্ট্রিং, অবজেক্ট> অ্যারে রূপান্তর করবেন


116

আমাকে HashMap<String, Object>একটি অ্যারেতে রূপান্তর করতে হবে; কেউ কি আমাকে দেখাতে পারে যে এটি কিভাবে হয়েছে?


4
আপনি কি, মান বা উভয় চান?
হার্টো

উত্তর:


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

সম্পাদন করা

এটি লক্ষ করা উচিত যে উভয় অ্যারের ক্রম একই নাও হতে পারে, জোড় কী / মানগুলির প্রয়োজন হলে পুনরাবৃত্তির জন্য আরও ভাল পদ্ধতির জন্য অক্সবো_লাক্সের উত্তর দেখুন।


9
আসলে, এই কোডটি কোনও গ্যারান্টি দেয় না যে হ্যাশম্যাপ.কিসেট ()। টু অ্যারে () [0] আসল মানচিত্র থেকে হ্যাশম্যাপ.ভ্যালু () থেকে টু অ্যারে () [0] এর মূল কী হবে key সুতরাং এটি অত্যন্ত বিপজ্জনক
ক্র্যাকারজ্যাক

2
@ ক্র্যাকারজ্যাক 9 আপনি কি ব্যাখ্যা করতে পারেন?
জ্যাক উইলসন

12
কীগুলি দুটি অ্যারে জুড়ে তাদের মানগুলির সাথে মিলবে না।
ল্যান্ডন কুহন

5
@ জাকোবুদ ল্যান্ডন9720 সঠিক ... ক্রমটি চিত্তাকর্ষক-এলোমেলো, এবং আপনি কীগুলি একটি Setএবং মানগুলিতে রূপান্তর করার পরে [0] মানের সাথে [0] মান অনুসারে এটির নিশ্চয়তা দেওয়া যায় না Collection। যখন তারা প্রযুক্তিগতভাবে অ্যারেতে রূপান্তরিত হয়েছে (এবং আপনার প্রশ্নের উত্তর দেয়), মূল-মান জুটির ধারণাটি হারিয়ে গেছে - যার কারণে এটি একটি খুব বিভ্রান্তিমূলক (এবং বিপজ্জনক) উত্তর ....
ক্র্যাকারজ্যাক 9

আমি এই কোড স্নিপেটের বিপদটি প্রমাণ করতে পারি। আমি যখন এটি লিখেছিলাম, আমার টার্মিনালটি পৌঁছে গিয়ে আমাকে চড় মারল। মারাত্বক বিপদজনক! সতর্ক থাকুন!
আর্টবার্টকার্ট

65

যদি আপনি কীগুলি এবং মানগুলি চান তবে আপনি সর্বদা এটির মাধ্যমে করতে পারেন entrySet:

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

প্রতিটি এন্ট্রি থেকে আপনি (অবশ্যই) কী এবং মান উভয়ই পদ্ধতি getKeyএবং getValueপদ্ধতিগুলির মাধ্যমে পেতে পারেন


@ ক্র্যাকারজ্যাক 9 না, এটি কাজ করে। গৃহীত সমাধানের বিপরীতে, এইটি মূল-মান যুগলগুলি বজায় রাখে। আপনি এর {key, value}[]বিরোধিতা হিসাবে পানkey[], value[]
টোবিক

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
অ্যালেক্স

@ অ্যালেক্স "পুরানো আকারের অ্যারে ব্যবহারের পুরানো জাভা সংস্করণগুলিতে সুপারিশ করা হয়েছিল (...) তবে ওপেনজেডকে 6 এর দেরি আপডেট হওয়ার পরে এই কলটি অন্তর্ভুক্ত করা হয়েছিল, খালি অ্যারের সংস্করণটির কার্যকারিতাটিকে আগের তুলনায় একই এবং কখনও কখনও আরও ভাল করা হয়েছিল আকারের সংস্করণ। এছাড়াও প্রাক-আকারের অ্যারে পাস করা সমকালীন বা সিঙ্ক্রোনাইজড সংগ্রহের জন্য বিপজ্জনক কারণ আকার এবং টু অ্যারে কলের মধ্যে ডেটা রেস সম্ভব হয় যার ফলশ্রুতিতে যদি সংগ্রহটি একই সময়ে সঙ্কুচিত হয় তবে অপারেশন." - ইন্টেলিজ
হামবুর্গ

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

পারফেক্ট! আমরা কী এবং মান উভয়ই পাই, অটো প্রকারের সাথে গ্রহন পূর্ণ হয়, দীর্ঘ সময় এটি অনুসন্ধান করে থাকি, ধন্যবাদ!
কুম্ভ শক্তি

12

ক্র্যাকারজ্যাকস পরামর্শের একটি বিকল্প, যদি আপনি হ্যাশম্যাপকে শৃঙ্খলা বজায় রাখতে চান তবে আপনি তার পরিবর্তে লিংকডহ্যাশম্যাপটি বিবেচনা করতে পারেন। যতদূর আমি অবগত রয়েছি এটির কার্যকারিতা হ্যাশম্যাপের অনুরূপ তবে এটি ফিফো তাই এটি আইটেমগুলি যুক্ত করার ক্রম বজায় রাখে।


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+ ব্যবহার করছেন এবং যদি কোনও 2 মাত্রিক প্রয়োজন হয় Array, সম্ভবত টেস্টএনজি ডেটা সরবরাহকারীদের জন্য, আপনি চেষ্টা করতে পারেন:

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

যদি আপনার Objectগুলি হয় 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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.