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

116

Мне нужно преобразовать HashMap<String, Object>в массив; может кто-нибудь показать мне, как это делается?

burntsugar
источник
4
вам нужны ключи, значения или и то, и другое?
harto 07

Ответы:

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 правильный ... порядок является псевдослучайным, и нельзя гарантировать, что ключ [0] будет соответствовать значению [0] после преобразования ключей в a Setи значений в a Collection. Хотя они технически преобразованы в массивы (и отвечают на ваш вопрос), концепция пары ключ-значение была утеряна - вот почему это очень вводящий в заблуждение (и опасный) ответ ...
CrackerJack9
Я могу подтвердить опасность этого фрагмента кода. Когда я написал это, мой терминал протянул руку и ударил меня. Чрезвычайно опасно! Осторожно!
artburkart
65

Если вам нужны ключи и значения, вы всегда можете сделать это с помощью entrySet:

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

Из каждой записи можно (конечно же ) получить как ключ и значение с помощью getKeyи getValueметодов

oxbow_lakes
источник
@ CrackerJack9 Нет, работает. В отличие от принятого решения, это поддерживает пары ключ-значение. Вы получаете {key, value}[]в отличие отkey[], value[]
Tobiq
51

Если у вас есть HashMap<String, SomeObject> hashMapто:

hashMap.values().toArray();

Вернем Object[]. Если вместо этого вам нужен массив типа SomeObject, вы можете использовать:

hashMap.values().toArray(new SomeObject[0]);
kmccoy
источник
3
Я думаю, вы имеете в виду values()вместо keySet()массива SomeObject.
Пол Беллора
4
Вы также можете повысить производительность, указав заранее размер массива вместо 0. См. Пример здесь: stackoverflow.com/a/5061692/265877
Alex
@Alex "В более старых версиях Java было рекомендовано использовать массив с предварительно заданным размером (...) Однако, после поздних обновлений OpenJDK 6, этот вызов был встроен, что сделало производительность версии с пустым массивом такой же, а иногда и лучше, по сравнению с предыдущей версией. -sized version.Также передача массива с предварительно заданным размером опасна для параллельной или синхронизированной коллекции, поскольку возможна гонка данных между размером и вызовом toArray, что может привести к дополнительным значениям NULL в конце массива, если коллекция одновременно сокращалась во время операция." - 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++;
}
CrackerJack9
источник
идеальный! мы получаем и ключ, и значение, автоматические типы заполняют eclipse, долгое время искали это, спасибо!
Водолей Сила
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);

Если у вас Objectесть Strings и вам нужен a 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 как возвращаемый тип. Вы можете изменить его на требуемый тип возвращаемого значения.

Mayur
источник
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);
Рома Иртов
источник