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


116

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


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методов


@ 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, этот вызов был встроен, что сделало производительность версии с пустым массивом такой же, а иногда и лучше, по сравнению с предыдущей версией. -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++;
}

идеальный! мы получаем и ключ, и значение, автоматические типы заполняют eclipse, долгое время искали это, спасибо!
Водолей Сила

12

Альтернатива предложению CrackerJacks, если вы хотите, чтобы HashMap поддерживал порядок, вы можете вместо этого использовать LinkedHashMap. Насколько мне известно, его функциональность идентична HashMap, но это FIFO, поэтому он поддерживает порядок, в котором были добавлены элементы.



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


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