Java: як перетворити HashMap <String, Object> в масив


116

Мені потрібно перетворити a 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 (). ToArray () [0] буде оригінальним ключем для hashMap.values ​​(). ToArray () [0] з вихідної карти. Тож це надзвичайно небезпечно
CrackerJack9

2
@ CrackerJack9 ви можете пояснити?
Джейк Вілсон

12
Клавіші зазвичай не відповідають їхнім значенням у двох масивах.
Ландон Кун

5
@Jakobud landon9720 вірно ... порядок psuedo-випадковий, і не можна гарантувати, що ключ [0] буде відповідати значенню [0] після перетворення ключів у a Setта значень у a Collection. Хоча вони технічно перетворюються на масиви (і відповідають на ваше запитання), концепція пари ключ-значення втрачена - саме тому це дуже вводячи в оману (і небезпечно) відповідь ....
CrackerJack9

Я можу засвідчити небезпеку цього фрагмента коду. Коли я написав це, мій термінал простягся і мене ляпав. Надзвичайно небезпечно! Остерігайся!
artburkart

65

Якщо вам потрібні ключі та значення, ви завжди можете це зробити за допомогою entrySet:

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

З кожного запису ви можете (звичайно) отримати як ключ, так і значення за допомогою методів getKeyтаgetValue


@ 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
Alex

@Alex "У старіших версіях Java, що використовують масив попереднього розміру, рекомендували (...) Однак, оскільки пізні оновлення OpenJDK 6 цей виклик був інтенсифікований, завдяки чому продуктивність порожньої версії масиву однакова, а іноді навіть краща, порівняно з попередньою версія також розміщена. Також передача попередньо розмірного масиву небезпечна для одночасного або синхронізованого збору, оскільки можлива гонка даних між розміром та викликом toArray, що може призвести до додаткових нулів в кінці масиву, якщо колекція одночасно скорочувалася під час операція ". - intellij
Гамбург приємно

30

Щоб гарантувати правильний порядок для кожного масиву ключів і значень, використовуйте це (в інших відповідях використовуються окремі Sets, які не дають гарантії щодо замовлення.

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. Наскільки я знаю, що функціонал ідентичний 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

Якщо ви використовуєте Java 8+ і вам потрібна двовимірна Array, можливо, для постачальників даних TestNG, ви можете спробувати:

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

Якщо ваш Objects і Strings вам потрібен 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;
    }

Тут я використовую String як тип повернення. Ви можете змінити його на потрібний тип повернення.


1
питання про те, HashMap()але ваше рішення стосується Hashtable()... Є деякі відмінності між ними
Чолецький,

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.