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

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

Ответ 1

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

Изменить

Следует отметить, что упорядочение обоих массивов может быть не таким, См. Ответ oxbow_lakes для лучшего подхода к итерации, когда необходимы пары/значения пары.

Ответ 2

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

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

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

Ответ 3

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

hashMap.values().toArray();

вернет объект []. Если вместо этого вы хотите получить массив типа SomeObject, вы можете использовать:

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

Ответ 4

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

Ответ 5

Альтернатива предложению 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]);
    }
}

Ответ 7

Я использовал почти то же самое, что и @kmccoy, но вместо keySet() я сделал это

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

Ответ 8

Чтобы попасть в один размерный массив.

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

Ответ 9

Вы также можете попробовать это.

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

Ответ 10

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

Ответ 11

HashMap<String, String> hashMap = new HashMap<>();
String[] stringValues= new String[hashMap.values().size()];
hashMap.values().toArray(stringValues);

Ответ 12

Если вы используете Java 8+ и вам нужен 2-мерный Array, возможно, для поставщиков данных TestNG, вы можете попробовать:

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);